首先,利用iterate生成Fibonacci的pair序列,1
fibpairlst = iterate (\(x1,x2)->(x1+x2,x1+2*x2)) (1,1)
运行结果如下,1
2
3*Main> let fibpairlst = iterate (\(x1,x2)->(x1+x2,x1+2*x2)) (1,1)
*Main> take 10 fibpairlst
[(1,1),(2,3),(5,8),(13,21),(34,55),(89,144),(233,377),(610,987),(1597,2584),(4181,6765)]
然后,再用foldr将pair序列展平(flat)即可得到一个斐波那契数列(Fibonacci Sequence):1
foldr (\(x1,x2) xs->x1:x2:xs) [] fibpairlst
综上所述,1
2fiblst = let fibpairlst = iterate (\(x1,x2)->(x1+x2,x1+2*x2)) (1,1)
in foldr (\(x1,x2) xs->x1:x2:xs) [] fibpairlst
生成的序列是一个无穷序列,可以用take函数来选出前n个,也可以直接用!!运算符来选出特定的某个。1
2
3
4
5
6
7
8
9
10*Main> take 20 fiblst
[1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765]
*Main> fiblst !! 20
10946
*Main> fiblst !! 5
8
*Main> fiblst !! 3
3
*Main> fiblst !! 1
1
我想这可能是最快的递推生成的斐波那契数列的方法了吧,由于Haskell的惰性求值机制,当用到某个值时直接递推计算,没有产生任何中间冗余的结果,也没有重复运算。