Fibonacci数字以初始的两个值作为参数

Ase*_*sal 5 haskell fibonacci lazy-evaluation

我一直在努力创建一个无限的斐波纳契列表,产生的函数可以将前2个值作为参数.

如果没有指定前两个值,就可以这样做

fib = 1 : 1 : zipWith (+) fib (tail fib)
Run Code Online (Sandbox Code Playgroud)

假设我想用5和6而不是1,1或0,1开始斐波那契序列,那么我将不得不改变上面的代码.但是当我试图制作一个惰性列表生成器,我可以在其中指定斐波那契序列的前2个值时,我很难过.我想出了这个但是没有用.

fib a b = a : b : zipWith (+) fib (tail fib)
Run Code Online (Sandbox Code Playgroud)

问题很明显.我试图转换硬编码列表的使用.我怎么解决这个问题?

pig*_*ker 15

怎么样

fib a b = fibs where fibs = a : b : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)

?使用相同的方法,但您的参数在范围内.

我应该补充一点,万一你被诱惑

fib a b = a : b : zipWith (+) (fib a b) (tail (fib a b))  -- worth trying?
Run Code Online (Sandbox Code Playgroud)

where fibs版本确保只生成一个无限流.后者有可能为每次递归调用生成一个新流fib.编译器可能足够聪明地发现公共子表达式,但依靠这样的运气是不明智的.尝试两个版本,ghci看看计算第1000个元素需要多长时间.

  • 请注意,"斐波纳契数"应始终为"[0,1,1,2,...]",因为这样可以提供很好的属性,例如`gcd(fib !! x)(fib !! y)= fib !! gcd xy` (3认同)