使用Fibonacci函数进行堆栈溢出

时间:2016-01-03 15:23:51

标签: f# fibonacci

我还在学习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?

1 个答案:

答案 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)