在Haskell中表示四面体数字的序列

我一直想学习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代码保留了“全面运行”方法,因为这是我想知道如何表达的概念。


你是对的,Haskell对于做这样的事情真的很好:

first_col = [0..]
second_col = scanl1 (+) first_col
third_col = scanl1 (+) second_col
  • first_col是从0开始的整数的无限列表
  • scanl (+)计算一个懒惰运行总和:Prelude文档
  • 我们可以验证上述代码是否正确:

    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]
    

    除了perimosocordiae的很好的答案之外,像Haskell这样的语言非常漂亮,它们允许您创建无限列表的无限列表。

    首先让我们定义产生每个连续行的操作符:

    op :: [Integer] -> [Integer]
    op = scanl1 (+)
    

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

    我们还需要一个基本情况:

    tnBase :: [Integer]
    tnBase = [0..]
    

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

    tn = iterate op tnBase
    

    iterate在Prelude中,可以使用hoogle和名称搜索(如果猜测得很好)或类型签名(通常知道需要的签名)来找到这些函数。 源代码通常是从haddock文档链接的。

    介绍

    (如果你对地图不熟悉,拿起,放下和头)

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

    getNthTN n = head (drop n tn)
    

    获得每个列表的前几个结果可能更多的是你想要的,但:

    printFirstFew n m = print $ take m (map (take n) tn)
    

    这里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]]
    
    链接地址: http://www.djcxy.com/p/14191.html

    上一篇: Represent sequence of tetrahedral numbers in Haskell

    下一篇: What are some good intermediate problems and projects for learning Haskell?