【发布时间】:2015-02-16 05:41:42
【问题描述】:
我正在学习Haskell,我写了一个简单的斐波那契函数:
fib :: Int -> Int
fib 1 = 1
fib 0 = 0
fib n = (fib (n-1)) + (fib (n-2))
似乎可以编译,并且将此脚本加载到 GHCI REPL 中,我可能会弄乱一些数字。 我试过了
fib 33
很惊讶它花了大约 4 秒才给出结果。 (对不起,我还不知道如何在 Haskell 中为函数计时,所以算了我自己)。
Fib 33 并不是特别费力。答案是不到400万。 所以我假设我的代码写得不是很好,或者我做递归的方式可能存在一些问题(好吧,它写得不好,因为它没有考虑负整数)。问题是,为什么它很慢? 任何帮助表示赞赏。
【问题讨论】:
-
这个问题似乎对 CodeReview 来说是个好问题。
-
查看您的代码时,想象一下例如
fib(5)的计算频率。每次迭代,您都会再次计算所有“内部”斐波那契数。 -
您应该使用经典的惰性无限列表版本:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)和fib n = fibs!!n。见the haskell wiki about the Fibonacci sequence。有趣的是,斐波那契因这个序列而闻名,这只是他应该成名的书中的一个小练习,将位值引入了西欧。