jva*_*ans 1 recursion haskell lazy-evaluation
我已经阅读了https://www.haskell.org/haskellwiki/Foldl_as_foldr和其他一些关于foldl和foldr之间区别的博客文章.现在我正在尝试将斐波那契序列作为带有折叠器的无限列表编写,我想出了以下解决方案:
fibs2 :: [Integer]
fibs2 = foldr buildFibs [] [1..]
where
buildFibs :: Integer -> [Integer] -> [Integer]
buildFibs _ [] = [0]
buildFibs _ [0] = [1,0]
buildFibs _ l@(x:s:z) = (x + s):l
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时take 3 fibs2,函数不会返回.我认为折叠是身体递归允许你在这些类型的情况下使用无限列表.为什么这不适合我的解决方案?
问问自己:哪个斐波那契数字将成为列表中的第一个?我对你的代码的解读是,这个问题的答案是"最大的一个"(从理论上讲,每次迭代都会buildFibs在结果列表的头部添加一个稍大的数字).由于有无限多的斐波那契数,这需要一段时间来计算!