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个元素需要多长时间.