递归是编程学习的一大门槛,于是我将写一系列的文章来记录和总结它;
C++函数能够自身调用自身,于是乎就可以用递归
首先是 包含一个递归调用的递归,
void recurs (argumentlist) { statements1 if (test) //test的值为0时,调用链将断开,递归调用停止 recurs(arguments) statements2 }
分析一下这段语句将如何运行,
每当 recurs() 函数被调用时,statements1将会被执行,
然后如果test的值是true,那么当前的recurs()会去调用一个新的recurs(),而先不去执行statements2,被调用的recurs()也会按照这样的规则去运行,
直到某一个recus()中的test的值为false,那么这个recurs()就不会再去调用recurs(),而去执行statements2,然后当statements2执行完,当前的recurs()的调用结束,
控制权被返回到调用这个recurs() 的 recurs(),再然后这个recurs()也是去执行statements2(因为这时 if 语句已执行完,按照顺序statements2将会被执行)结束后,控制权再被返回,
依次类推,直到最初的recurs()运行完,整个递归调用就结束了。
下面给出一个样例程序:
#include <iostream> #include <cstdio> using namespace std; void countdown(int n) { printf("This number is %d\n",n); if(n>0) countdown(n-1); printf("%d Kaboom\n",n); } using namespace std; int main() { countdown(4); return 0; }
你可以先自己模拟,然后再在本地上运行一下,看看结果是否如你所想;
注意,每一个递归调用都会创建一套自己的变量,于是当以上程序带到第五次调用时,就有了五个独立的n变量,它们拥有不同的值和地址,
你可以修改上面的程序让他在输出n的值时,同时输出n的地址,以验证。
当然,如果在一个递归中,有一系列变量(比如a,在递归的过程中他的值并没有像n一样发生改变,但在每一个递归调用中他的地址还是不一样的)。
好了,这篇文章就先讲到这里,下一篇将会讲包含多个递归调用的递归。
如果你觉得这篇文章好的话,希望能得到你的一个赞,如果有问题或意见也可在下方评论区点出,
谢谢,QwQ!
原文:https://www.cnblogs.com/majorin/p/11920373.html