我一直在尝试制作一个无限斐波那契列表生成函数,该函数可以将前 2 个值作为参数。
在不指定前两个值的情况下,可以像这样
fib = 1 : 1 : zipWith (+) fib (tail fib)
假设我想以 5 和 6 而不是 1,1 或 0,1 开始斐波那契数列,那么我将不得不更改上面的代码。但是当试图制作一个惰性列表生成器时,我可以在其中指定斐波那契数列的前 2 个值,我被难住了。我想出了这个,但没有奏效。
fib a b = a : b : zipWith (+) fib (tail fib)
问题很明显。我正在尝试将列表的使用转换为硬编码的。我该如何解决?
请您参考如下方法:
怎么样
fib a b = fibs where fibs = a : b : zipWith (+) fibs (tail fibs)
?使用相同的方法,但参数在范围内。
我应该补充一点,以防你被诱惑
fib a b = a : b : zipWith (+) (fib a b) (tail (fib a b)) -- worth trying?
where fibs version 确保只生成一个无限流。后者可能会为每个
fib 的递归调用生成一个新流。 .编译器可能足够聪明地发现公共(public)子表达式,但依靠这种运气是不明智的。在
ghci 中尝试这两个版本看看计算第 1000 个元素需要多长时间。




