Fibonacci Haskell实现的问题

时间:2011-07-03 10:37:45

标签: haskell stack-overflow fibonacci

刚刚开始重新学习Haskell(在大学做过,但忘了大部分)并且认为我会实现一个斐波那契函数来开始。但是,即使是非常小的n,我仍然会收到堆栈溢出。

有人能发现我的功能有什么问题吗?

fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n+1)

2 个答案:

答案 0 :(得分:7)

您的斐波那契公式中有错误:

fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

请注意最后一个术语,其中n-2代替n+1

答案 1 :(得分:2)

这是一个非常糟糕的实现,你应该使用尾递归,从0或1开始向上并传递前两个斐波纳契数。还有一个bug,fib n取决于fib n + 1。

fib :: Integer -> Integer
fib 0 = 0
fib n = iter 0 1 n
  where iter :: Integer -> Integer -> Integer -> Integer
        iter f1 f2 0 = f2
        iter f1 f2 n = iter f2 (f1+f2) (n-1)