我还在学习F#,所以请温柔地对待我!我试图定义一个函数来生成像这样的斐波纳契数...
let rec fib n =
match n with
| 0 -> 1
| 1 -> 1
| n -> fib(n-1) + (fib n-2)
然而,虽然这给出了0和1的正确结果,但它给出了2的堆栈溢出。我知道这不是尾递归,但是对于2的输入,我不会期望成为一个问题。
我认为模式匹配工作正常,因此输入为2时,它将匹配第三个模式,得到1 + 1的结果(是fib 0和fib 1的结果)。
为什么我得到SO?
答案 0 :(得分:2)
你声明:
| n -> fib(n-1) + (fib n-2)
意思是:
| n -> fib(n-1) + fib(n)-2
如果我有这样的调用,它将与fib(n-1)
一起使用,因为n的每个调用值将减1,而对于fib(n)
,您将继续使用相同的方法调用值,直到你得到stackoverflow异常。为避免这种情况,您需要:
| n -> fib(n-1) + fib(n-2)