杨辉三角
【题目】
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
。。。
这个阵势叫杨辉三角,国外叫帕斯卡三角。前一行的数字中,每两个相邻的数字相加就得到下一行的数字。左右两边的数永远是 1
写个程序,输出前几行的杨辉三角。
给定前一行,生成出下一行,这正是生成器模式(或叫产生器模式),haskell解法:
import Data.List (intersperse)
yang_hui :: [[Int]]
yang_hui = iterate f [1] where
g [x] = [1]
g (x:y:ys) = x+y : g (y:ys)
f x = 1 : g x
out = concat . intersperse "\n" . map show $ take 6 yang_hui
main = putStrLn out
对一个序列中的相邻两个元素运算,产生一个新元素,还可以这么处理
当,x = [1, 2, 1] 时,
0 1 2 1
1 2 1 0
对应相加就可以得
1 3 3 1 了。
也就是说,对这两个列表作 zipWith 运算就可以了。
这是另一版本的:
yang_hui = iterate f [1] where
f x = zipWith (+) (0:x) (x++[0])