为什么斐波纳契递归序列有效?

时间:2016-02-25 02:53:03

标签: function recursion fibonacci

我想知道为什么这个Fibonacci递归函数有效:

(function() {
    var id = i;
    viewQuantity.addEventListener('click', function(e) {
        viewQuantity.backgroundColor = '#FFFFFF';
    });
})(); 

我理解Fibonacci序列是什么,我理解递归函数的作用以及函数的工作原理。我很难理解为什么它有效。我知道当你把它分解时,你实际上是在添加一堆0和1,如图所示。

fibonacci recursive

但是为什么当我将5传递给函数并添加所有0和1时它将等于Fibonacci序列中的第5个序列号?我之前已经看过这个问题,但从未真正解释过。答案都只是"因为递归"。是的,我知道递归函数是什么以及这个函数是如何工作的。但是为什么这个递归函数会给出正确的Fibonacci序列号?

2 个答案:

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

我确定你知道这一切,但我认为这将有助于我的解释将此部分作为参考。

Ones和Zeros进来的地方

解释这个问题的最好方法可能是一个例子。

想象一下,如上所述,我们正在尝试 递归 计算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,直到我们处于基本情况。我希望所有这一切都有道理。递归思考可能非常困难。这是一个从上到下的视觉表示。

enter image description here

简而言之。这只是将先前的斐波纳契序列添加到当前的序列,直到它到达当前循环。