用Haskell生成帕斯卡三角形

本文介绍了如何利用Haskell的惰性求值特性,简洁地生成帕斯卡三角形。通过将帕斯卡三角形的每一列视为前一列的数列积分,作者展示了这种数学概念在Haskell编程中的应用。

转载时请注明出处和作者联系方式

作者联系方式:会飞的鱼 <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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值