斐波那契函数的堆栈溢出
Stack overflow with Fibonacci function
我还在学习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?
你的声明:
| n -> fib(n-1) + (fib n-2)
表示:
| n -> fib(n-1) + fib(n)-2
如果我有这样的调用,它会与 fib(n-1)
一起工作,因为每次调用 n 的值都会减少 1,而对于 fib(n)
你会继续调用相同的方法具有相同的值,直到您获得 Whosebug 异常。为避免这种情况,您需要:
| n -> fib(n-1) + fib(n-2)
我还在学习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?
你的声明:
| n -> fib(n-1) + (fib n-2)
表示:
| n -> fib(n-1) + fib(n)-2
如果我有这样的调用,它会与 fib(n-1)
一起工作,因为每次调用 n 的值都会减少 1,而对于 fib(n)
你会继续调用相同的方法具有相同的值,直到您获得 Whosebug 异常。为避免这种情况,您需要:
| n -> fib(n-1) + fib(n-2)