【发布时间】:2016-01-03 15:23:50
【问题描述】:
我还在学习 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),它调用fib n,直到堆栈溢出。应该是| n -> fib (n-1) + fib (n-2)。这是一个简单的错字,所以我投票结束了这个问题。 -
@JakubLortz 感谢您对我的错误的解释。不知道你为什么要结束这个问题,我敢肯定我不是第一个(或最后一个)犯这个错误的人。可能对其他人有用。
-
附注:让你的函数尾递归以避免各种堆栈溢出
-
@Mikhail 是的,我知道,谢谢。我仍在学习 F#,并且一步一步地学习。我想要一个有效的 fib 函数,然后打算使用尾递归对其进行修改。不过感谢您的提醒!