表示Haskell中四面体数的序列

jny*_*len 5 haskell list

我一直想要学习一些Haskell,我知道它和类似的语言对各种无限列表都有很好的支持.那么,我怎样才能在Haskell中表示四面体数的序列,最好解释一下发生了什么?

0   0   0
1   1   1
2   3   4
3   6   10
4   10  20
5   15  35
6   21  56
7   28  84
8   36  120
Run Code Online (Sandbox Code Playgroud)

如果不清楚那里发生了什么,第二列是第一列的运行总计,第三列是第二列的运行总计.我更喜欢Haskell代码保留一些"运行总计"的方法,因为这是我想知道如何表达的概念.

per*_*iae 10

你是对的,Haskell非常适合做这样的事情:

first_col = [0..]
second_col = scanl1 (+) first_col
third_col = scanl1 (+) second_col
Run Code Online (Sandbox Code Playgroud)
  • first_col 是一个无限的整数列表,从0开始
  • scanl (+)计算延迟运行总和:Prelude docs

我们可以验证上面的代码是做正确的事情:

Prelude> take 10 first_col 
[0,1,2,3,4,5,6,7,8,9]
Prelude> take 10 second_col 
[0,1,3,6,10,15,21,28,36,45]
Prelude> take 10 third_col 
[0,1,4,10,20,35,56,84,120,165]
Run Code Online (Sandbox Code Playgroud)

  • 啊,当你使用ghci时,你需要使用`let`作为前缀.试试`let first_col = [0..1]` (3认同)

Tho*_*son 6

添加perimosocordiae的答案非常好,像Haskell这样的语言是如此灵活,它们允许您创建无限列表的无限列表.

首先让我们定义生成每个连续行的运算符:

op :: [Integer] -> [Integer]
op = scanl1 (+)
Run Code Online (Sandbox Code Playgroud)

正如perimosocordiae所解释的,这只是一个懒惰的运行总和.

我们还需要一个基本案例:

tnBase :: [Integer]
tnBase = [0..]
Run Code Online (Sandbox Code Playgroud)

那么我们如何获得无限四面体数列表的无限列表呢?我们在基本情况下迭代此操作,然后在基本情况下产生输出,然后输出...

tn = iterate op tnBase
Run Code Online (Sandbox Code Playgroud)

iterate在Prelude中,可以使用hoogle找到这些函数并按名称搜索(如果你有一个好的猜测)或类型签名(你通常知道你需要的签名). 源代码通常从haddock文档链接.

介绍

(如果你对地图,拍摄,掉落和头部感到不舒服)

这一切都很好,但是如果你不知道如何通过第一个无限列表来查看第二个,第三个等等,那就没用了.有很多选项,只需要获得一个特定的列表就可以放弃第一个几个:

getNthTN n = head (drop n tn)
Run Code Online (Sandbox Code Playgroud)

获取每个列表的前几个结果可能更符合您的要求:

printFirstFew n m = print $ take m (map (take n) tn)
Run Code Online (Sandbox Code Playgroud)

这里将从每个四面体数列表中map (take n) tn取出第一个n值,同时take m将我们的结果限制在第一个m列表中.

最后,我喜欢用于快速交互式播放数据的精美新郎包:

> groom $ take 10 (map (take 10) tn)
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
 [0, 1, 3, 6, 10, 15, 21, 28, 36, 45],
 [0, 1, 4, 10, 20, 35, 56, 84, 120, 165],
 [0, 1, 5, 15, 35, 70, 126, 210, 330, 495],
 [0, 1, 6, 21, 56, 126, 252, 462, 792, 1287],
 [0, 1, 7, 28, 84, 210, 462, 924, 1716, 3003],
 [0, 1, 8, 36, 120, 330, 792, 1716, 3432, 6435],
 [0, 1, 9, 45, 165, 495, 1287, 3003, 6435, 12870],
 [0, 1, 10, 55, 220, 715, 2002, 5005, 11440, 24310],
 [0, 1, 11, 66, 286, 1001, 3003, 8008, 19448, 43758]]
Run Code Online (Sandbox Code Playgroud)