转载时请注明出处和作者联系方式
作者联系方式:会飞的鱼 <parker30_liu at hotmail dot com>
帕斯卡三角形(杨辉三角形)的每一列都可以看成是前一列的数列积分。即当n是从0开始的自然数,则C(x, n)是C(x, (n-1))中x在区间n到无穷大的数列积分。从这个定义出发可以用Haskell的惰性求值来用比较简单的方式得到帕斯卡三角形。
下面是ghci中实际运行的结果,输出结果未做裁切,是一个菱形。具体如下:这是定义数列积分
Prelude Data.List> let pasn pasn1 = pasln where
Prelude Data.List| pasln = 1 : zipWith ($) (tail (fmap (+) pasn1)) pasln
这是从数列[1,1,1,1,1..]开始逐次应用数列积分得到帕斯卡三角形
Prelude Data.List> let pasTri n = take n pasTris where
Prelude Data.List| pasTris = replicate n 1 : map pasn pasTris
这是输出帕斯卡三角形
Prelude Data.List> mapM_ print $ pasTri 5
[1, 1, 1, 1, 1]
[1, 2, 3, 4, 5]
[1, 3, 6, 10, 15]
[1 ,4,10,20,35]
[1, 5,15,35,70]
经过裁切后输出的帕斯卡三角形
Prelude Data.List> mapM_ (print . snd) . map (\(n, xs) -> (n, take (length xs - n) xs)) . zip [0..] . pasTri $ 6
[1,1,1,1,1,1]
[1,2,3,4,5]
[1,3,6,10]
[1,4,10]
[1,5]
[1]
本文介绍了如何利用Haskell的惰性求值特性,简洁地生成帕斯卡三角形。通过将帕斯卡三角形的每一列视为前一列的数列积分,作者展示了这种数学概念在Haskell编程中的应用。
297

被折叠的 条评论
为什么被折叠?



