我想知道为什么这个Fibonacci递归函数有效:
(function() {
var id = i;
viewQuantity.addEventListener('click', function(e) {
viewQuantity.backgroundColor = '#FFFFFF';
});
})();
我理解Fibonacci序列是什么,我理解递归函数的作用以及函数的工作原理。我很难理解为什么它有效。我知道当你把它分解时,你实际上是在添加一堆0和1,如图所示。
但是为什么当我将5传递给函数并添加所有0和1时它将等于Fibonacci序列中的第5个序列号?我之前已经看过这个问题,但从未真正解释过。答案都只是"因为递归"。是的,我知道递归函数是什么以及这个函数是如何工作的。但是为什么这个递归函数会给出正确的Fibonacci序列号?
答案 0 :(得分:4)
在Fibonacci序列中,前两个数字为零和一。之后的每个数字都是前两个数字的总和。所以前几个数字是
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);
}
}
我确定你知道这一切,但我认为这将有助于我的解释将此部分作为参考。
解释这个问题的最好方法可能是一个例子。
想象一下,如上所述,我们正在尝试 递归 计算F(6)
。请尝试按照上面给出的步骤。请记住,只有当n> gt时,我们才会执行递归。 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(2)
和F(1) ≡ 1
(两者都已知)得到F(0) ≡ 0
,因此我们可以计算实际值而不是执行更多递归。
我们现在可以找到F(2) = F(1) + F(0) = 1 + 0 = 1
。
注意1和0 当人们说整个事情归结为零和零时,人们正在谈论这些。每次我们递归以找到基值时,我们最终会找到F(2) = 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)
请记住,递归的工作原理是通过分解问题直到我们知道答案是什么,然后从那里构建它。
我们对斐波那契序列了解多少?
我们知道的时候:
x = 1 和 x = 0
那是最低的。这是一个重要的关键。因为当x = 0时,我们确实在做0 + 0,当x = 1时,我们确实在做0 + 1.现在从顶部开始。
... 0,1,1,2,3,5,8,13
如果我们在13岁那么13岁?为什么简单地说5 + 8对吧?那就是
int i = fibRec(n - 1) + fibRec(n - 2);
来自。因为这些将逐渐分支出来,直到我们处于每个人的基本情况。
这是递归调用。因为现在该方法将返回堆栈并再次调用fibRec。您会注意到(n-1)和(n-2)都被加在一起并设置为i。这样我们就不会失去价值。因为+符号,然后堆栈最终返回越来越多的(n-1)s和(n-2)s,直到我们处于基本情况。我希望所有这一切都有道理。递归思考可能非常困难。这是一个从上到下的视觉表示。
简而言之。这只是将先前的斐波纳契序列添加到当前的序列,直到它到达当前循环。