在斐波那契数列中,前两个数字是零和一。这些后面的每个数字都是前两个数字的总和。所以前几个数字是
F(0) ≡ 0
F(1) ≡ 1
F(2) = F(1) + F(0) = 1 + 0 = 1
F(3) = F(2) + F(1) = 1 + 1 = 2
F(4) = F(3) + F(2) = 2 + 1 = 3
F(5) = F(4) + F(3) = 3 + 2 = 5
F(6) = F(5) + F(4) = 5 + 3 = 8
...
F(n) = F(n - 1) + F(n - 2) ∀ n > 1
因此,当我们递归计算斐波那契数时,我们必须练习以下逻辑过程(出于对 StackOverflow 的考虑,使用伪代码)。
Integer NthFibonacci(Integer n) {
if (n < 0) {
return undefined;
} else if (n < 2) {
return n;
} else {
return NthFibonacci(n - 1) + NthFibonacci(n - 2);
}
}
我相信你知道这一切,但我认为将这部分作为参考将有助于我的解释。
1 和 0 的来源
最好的解释方式可能是举个例子。
想象一下,如上所述,我们正尝试递归地计算F(6)。尝试按照上面给出的过程。请记住,只有当 n > 1 时,我们才会执行递归。
首先我们从F(6) = F(5) + F(4) 开始。
然后我们找到F(5) = F(4) + F(3)。
然后我们找到F(4) = F(3) + F(2)。
然后我们找到F(3) = F(2) + F(1)。
然后我们找到F(2) = F(1) + F(0)。
这就是事情的开始!
我们现在得到了F(1) ≡ 1 和F(0) ≡ 0 的F(2)(两者都是已知的),因此我们能够计算一个实际值而不是执行更多的递归。
我们现在可以找到F(2) = F(1) + F(0) = 1 + 0 = 1。
注意 1 和 0 当人们说整个事情归结为 1 和 0 时,他们就是在谈论这些。每次我们递归找到一个基值时,我们最终都会找到F(2) = 1 + 0。这会导致更多的 1 和 0,因为我们向后移动递归树,能够计算越来越高的值,如下所示。
F(3) = F(2) + F(1) = (1 + 0) + 1
F(4) = F(3) + F(2) = ((1 + 0) + 1) + (1 + 0)
F(5) = F(4) + F(3) = (((1 + 0) + 1) + (1 + 0)) + ((1 + 0) + 1)
F(6) = F(5) + F(4) = ((((1 + 0) + 1) + (1 + 0)) + ((1 + 0) + 1)) + (((1 + 0) + 1) + (1 + 0))
现在如果你把所有的 1 相加,你会得到 8,所以F(6) = 8,这是正确的!
这是它的工作原理,也是它分解为 1 和 0 的方式。