这是一个不同且更简单的函数,用于计算第 n 个斐波那契数:
fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
您所指的实现依赖于一些关于 Fibonacci 中的值如何相互关联的观察(以及 Haskell 如何根据数据结构本身定义数据结构,从而有效地创建无限数据结构)
您问题中的函数的工作原理如下:
假设您已经有一个无限的斐波那契数列:
[ 1, 1, 2, 3, 5, 8, 13, .... ]
The tail
该列表中的
[ 1, 2, 3, 5, 8, 13, 21, .... ]
zipWith
使用给定的运算符逐个元素地组合两个列表:
[ 1, 1, 2, 3, 5, 8, 13, .... ]
+ [ 1, 2, 3, 5, 8, 13, 21, .... ]
= [ 2, 3, 5, 8, 13, 21, 34, .... ]
因此,可以通过添加元素来计算斐波那契数列的无限列表1
and 1
到使用斐波那契数列的无限列表的尾部压缩斐波那契数列的无限列表的结果+
操作员。
现在,要获取第 n 个斐波那契数,只需获取无限斐波那契数列表的第 n 个元素:
fib n = fibs !! n
Haskell 的美妙之处在于,它在需要时才计算斐波那契数列中的任何元素。
我让你的头爆炸了吗? :)