我一直在尝试制作一个无限斐波那契列表生成函数,该函数可以将前 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 个元素需要多长时间。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!