【发布时间】:2012-07-24 06:49:54
【问题描述】:
我想出了以下可行的尾递归斐波那契生成器:
let {
fibo :: Integral x => [x]->x->x->x->[x]
fibo l x y 0 = l
fibo l x y n = fibo (l ++ [y+x] ++ [y+x+y]) (x+y) (y+x+y) (n-1)
}
请原谅我将整个实现放在一行中,因为我正在使用 GHCi 并且还没有完全学会如何将它放入文件中并运行(我还没有到达那里)。我想知道的是如何调用:
fibo [0, 1] 0 1 5
可以改进。我不想用 0 和 1 传递初始列表,然后再用限制传递 0 和 1。我相信实施是可以改变的。可以做哪些改变?
【问题讨论】:
-
您可以像在解释器中那样将其逐行写入文件中(也无需将所有内容都包装在 let 块中),然后在解释器中加载文件(在 GHCi 中)带 :l 文件名)
-
你的代码是尾递归的,但是效率很低,因为
(++)在它的第一个参数中是线性的。但我想这不是问题的一部分。 -
Haskell 中的尾递归不需要像在严格语言中那样持续使用堆栈,相反,非尾递归也不需要线性堆栈使用,所以我质疑你练习的价值。坦率地说,我会选择经典的
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)或其变体之一scanl或unfoldr。请参阅this HaskellWiki page 了解一系列实现。
标签: haskell fibonacci tail-recursion