我一直想要学习一些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
如果不清楚那里发生了什么,第二列是第一列的运行总计,第三列是第二列的运行总计 . 我更喜欢Haskell代码保留一些“运行总计”的方法,因为这是我想知道如何表达的概念 .
2 回答
你是对的,Haskell非常适合做这样的事情:
first_col
是一个无限的整数列表,从0开始scanl (+)
计算一个懒惰的运行总和:Prelude docs我们可以验证上面的代码是做正确的事情:
除了perimosocordiae的最佳答案之外,像Haskell这样的语言非常灵活,它们允许您创建无限列表的无限列表 .
首先让我们定义生成每个连续行的运算符:
正如perimosocordiae所解释的,这只是一个懒惰的运行总和 .
我们还需要一个基本案例:
那么我们如何得到无限的四面体数列表?我们在基本情况下迭代此操作,然后在基本情况下产生输出,然后输出...
iterate
在Prelude中,可以使用hoogle和searching by name(如果你有一个好的猜测)或type signature(你通常知道你需要的签名)找到这样的功能 . Source code通常链接自haddock documentation .Presentation
(如果你对 Map ,拍摄,掉落和头部感到不舒服)
这一切都很好,但是如果你不知道如何通过第一个无限列表来查看第二个,第三个等等,那就没用了 . 有很多选项,只需要获得一个特定的列表就可以放弃第一个几个:
获取每个列表的前几个结果可能更符合您的要求:
这里
map (take n) tn
将从每个四面体数列表中获取第一个n
值,而take m
将我们的结果限制在第一个m
列表中 .最后,我喜欢用于快速交互式播放数据的精彩groom包: