递归如何获得以前的值? 我是学习C++基础的基础,我遇到了一个我不理解的递归例子。该方程适用于斐波那契数,如下所示: int fibo(int f) { if (f < 3) { return 1; } else { return fibo(f - 2) + fibo(f - 1); } } intfibo(intf) { 如果(f

递归如何获得以前的值? 我是学习C++基础的基础,我遇到了一个我不理解的递归例子。该方程适用于斐波那契数,如下所示: int fibo(int f) { if (f < 3) { return 1; } else { return fibo(f - 2) + fibo(f - 1); } } intfibo(intf) { 如果(f,c++,C++,“else”语句是如何工作的?我知道它把前面的两个数相加得到当前的斐波那契数,但是在没有任何先验信息的情况下,它怎么知道从哪里开始呢?如果我想要第七个斐波那契数,它怎么知道第六个和第五个数是什么?在这个给定的方程中,它的根会更深。当您最初给出值7时,它将转到函数本身以获得值7-2=5和7-1=6,但它仍然没有值5和6。因此,它将进一步减小值5到3和4,以及6到5和4。 最后,当f小于3时,它将返回值1。在得到根值之后,它将把这些值相加,得到总的答案。在这个给定的方程中,它将深入根。当您最初给出值

“else”语句是如何工作的?我知道它把前面的两个数相加得到当前的斐波那契数,但是在没有任何先验信息的情况下,它怎么知道从哪里开始呢?如果我想要第七个斐波那契数,它怎么知道第六个和第五个数是什么?

在这个给定的方程中,它的根会更深。当您最初给出值7时,它将转到函数本身以获得值7-2=5和7-1=6,但它仍然没有值5和6。因此,它将进一步减小值5到3和4,以及6到5和4。
最后,当f小于3时,它将返回值1。在得到根值之后,它将把这些值相加,得到总的答案。

在这个给定的方程中,它将深入根。当您最初给出值7时,它将转到函数本身以获得值7-2=5和7-1=6,但它仍然没有值5和6。因此,它将进一步减小值5到3和4,以及6到5和4。
最后,当f小于3时,它将返回值1。类似的情况是,在得到根值后,它将把这些值相加,得到总的答案。

递归函数将根据需要多次调用自己来计算最终值。例如,如果调用
fibo(3)
,它将使用
fibo(2)
fibo(1)
调用自己

如果写下表示所有函数调用的树(括号中的数字是返回值),您可以更好地理解它:

对于
fibo(7)
,您将有如下多个调用:

                             fibo(7) [fibo(6) + fibo(5)]
                                |
              .-----------------------------------------------.
              |                                               |
           fibo(6) [fibo(5) + fibo(4)]                      fibo(5) [fibo(4) + fibo(3)]
              |                                               |
     .---------------------------------.                     ...
     |                                 | 
fibo(5) [fibo(4) + fibo(3)]        fibo(4) [fibo(3) + fibo(2)]
     |                                 |
    ...                               ... 
每个递归调用都将执行相同的代码,但具有不同的值
f
。每个递归调用都必须调用它们自己的子用例“版本”(较小的值)。直到每个人都达到基本情况(
f<3
)时才会发生这种情况


我没有画整棵树。但我想你可以看到它长得很快。有很多重复(
fibo(7)
调用
fibo(6)
fibo(5)
),然后
fibo(6)
再次调用
fibo(5)
)。这就是为什么我们通常不递归地实现斐波那契函数,除了研究递归之外。

递归函数会根据计算最终值的需要多次调用自己。例如,如果调用
fibo(3)
,它将使用
fibo(2)
fibo(1)
调用自己

如果写下表示所有函数调用的树(括号中的数字是返回值),您可以更好地理解它:

对于
fibo(7)
,您将有如下多个调用:

                             fibo(7) [fibo(6) + fibo(5)]
                                |
              .-----------------------------------------------.
              |                                               |
           fibo(6) [fibo(5) + fibo(4)]                      fibo(5) [fibo(4) + fibo(3)]
              |                                               |
     .---------------------------------.                     ...
     |                                 | 
fibo(5) [fibo(4) + fibo(3)]        fibo(4) [fibo(3) + fibo(2)]
     |                                 |
    ...                               ... 
每个递归调用都将执行相同的代码,但具有不同的值
f
。每个递归调用都必须调用它们自己的子用例“版本”(较小的值)。直到每个人都达到基本情况(
f<3
)时才会发生这种情况


我没有画整棵树。但我想你可以看到它长得很快。有很多重复(
fibo(7)
调用
fibo(6)
fibo(5)
),然后
fibo(6)
再次调用
fibo(5)
)。这就是为什么我们通常不递归地实现斐波那契(Fibonacci),除了研究递归。

试着用笔和纸遍历算法。如果你是编程新手,通过计算斐波那契序列来学习递归是很粗糙的:)我认为最好的开始方法是学习使用调试器;并了解
fibo(1)
的作用。然后
fibo(2)
。然后
fibo(3)
。学习使用调试器是编程最重要的一课;如果人们不知道如何编写函数,我不会费心去教他们比如何编写函数更复杂的东西。老实说,这真的很重要。它知道前面的两个值是什么,这样它就可以求和得到我的值,而不需要任何后面的信息吗?--你可能没有意识到,但你对“后验信息”的认识很有趣。正如您所怀疑的,更好(即更快)的斐波那契递归函数将保存先前的信息,以便以后在计算序列时使用。它不知道值是什么。它只是用不同的值对自己进行两次分类。如果递归函数不好,很容易得到无限循环或烧掉堆栈内存。在这种情况下,条件f<3作为停止标准。此外,递归的这种实现非常慢,就像计算f(n)的n^2操作一样。试着用笔和纸遍历算法。如果你是编程新手,通过计算斐波那契序列来学习递归是很粗糙的:)我认为最好的开始方法是学习使用调试器;并了解
fibo(1)
的作用。然后
fibo(2)
。然后
fibo(3)
。学习使用调试器是编程最重要的一课;如果人们不知道如何编写函数,我不会费心去教他们比如何编写函数更复杂的东西。老实说,这真的很重要。它知道前面的两个值是什么,这样它就可以求和得到我的值,而不需要任何后面的信息吗?--你可能没有意识到,但你对“后验信息”的认识很有趣。正如您所怀疑的,更好(即更快)的斐波那契递归函数将保存先前的信息,以便以后在计算序列时使用。它不知道值是什么。它只是用不同的值对自己进行两次分类。如果递归函数不好,很容易得到一个无限循环或烧坏