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

Function 为什么斐波那契递归序列有效?,function,recursion,fibonacci,Function,Recursion,Fibonacci,我想知道为什么这个斐波那契递归函数可以工作: int fibRec(int n) { if ((n == 1) || (n == 0)) { return n; } int i = fibRec(n - 1) + fibRec(n - 2); return i; } 我了解什么是斐波那契序列,我了解递归函数的功能以及这个函数是如何工作的。我只是很难理解它为什么起作用。我知道当你分解它时,你实际上是在添加一堆0和1,如图所示 但是为什么

我想知道为什么这个斐波那契递归函数可以工作:

int fibRec(int n)
{
    if ((n == 1) || (n == 0))
    {
        return n;
    }

    int i = fibRec(n - 1) + fibRec(n - 2);
    return i;
}
我了解什么是斐波那契序列,我了解递归函数的功能以及这个函数是如何工作的。我只是很难理解它为什么起作用。我知道当你分解它时,你实际上是在添加一堆0和1,如图所示


但是为什么当我把一个5传递给这个函数,并且所有的0和1都被加上,它将等于斐波那契序列中的第5个序列号呢?我以前见过有人问这个问题,但从未真正解释过。所有的回答都是“因为递归”。是的,我知道什么是递归函数以及这个函数是如何工作的。但是为什么这个递归函数会给出正确的斐波那契序列号呢?

记住,递归的工作原理是将问题分解,直到我们知道答案是什么,然后在此基础上构建它

关于斐波那契序列我们知道什么

我们知道,当:

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,直到到达基本情况。我希望所有这些都有意义。递归思考可能非常困难。这是一个从上到下的视觉表现


简而言之。这只是不断地将前面的斐波那契序列添加到当前序列,直到它到达当前循环。

记住,递归的工作原理是将问题分解,直到我们知道答案是什么,然后从那里建立它

关于斐波那契序列我们知道什么

我们知道,当:

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,直到到达基本情况。我希望所有这些都有意义。递归思考可能非常困难。这是一个从上到下的视觉表现


简而言之。这只是将前面的fibonacci序列添加到当前循环中。

在fibonacci序列中,前两个数字是0和1。之后的每个数字都是前两个数字的总和。所以前几个数字是

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
因此,当我们递归计算斐波那契数时,我们必须实践以下逻辑过程(在伪代码中,与堆栈溢出无关)

现在,如果你把所有的1加起来,你会得到8的和,因此
F(6)=8,这是正确的


这就是它的工作原理,这就是它如何分解为1和0。

在斐波那契序列中,前两个数字是0和1。之后的每个数字都是前两个数字的总和。所以前几个数字是

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
因此,当我们递归计算斐波那契数时,我们必须实践以下逻辑过程(在伪代码中,与堆栈溢出无关)

现在,如果你把所有的1加起来,你会得到8的和,因此
F(6)=8,这是正确的


这就是它的工作原理,这就是它分解为1和0的方式。

如果您用节点返回的结果注释fib(n)节点,可能会有所帮助;或者,如果你完全在纸上计算出fib(5)。另一种看待它的方式是:仔细构造的(!)0和1的总和产生fib-5,因为这就是fib-5的最终定义;类似于将“1”和“2”之和定义为“3”。如果使用节点返回的结果注释fib(n)节点,可能会有所帮助;或者,如果你完全在纸上计算出fib(5)。另一种看待它的方式是:仔细构造的(!)0和1的总和产生fib-5,因为这就是fib-5的最终定义;类似于“1”和“2”之和被定义为“3”。非常感谢!!它终于成功了。我正在看你为每个F(n)提供的细分,然后它才慢慢开始有意义。理解F(0)和F(1)是设定的数字,然后再加上前两个数字,这一点至关重要。我甚至通过让F(0)=5和F(1)=6来创建自己的序列,并且能够预测输出。再次感谢你@没问题!很乐意帮忙。非常感谢!!它终于成功了。我正在看你为每个F(n)提供的细分,然后它才慢慢开始有意义。理解F(0)和F(1)是设定的数字,然后再加上前两个数字,这一点至关重要。我甚至通过让F(0)=5和F(1)=6来创建自己的序列,并且能够预测输出。再次感谢你@没问题!很乐意帮忙。