刚刚开始重新学习Haskell(在大学做过,但忘了大部分)并且认为我会实现一个斐波那契函数来开始。但是,即使是非常小的n
,我仍然会收到堆栈溢出。
有人能发现我的功能有什么问题吗?
fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n+1)
答案 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)