案例一:
void recurs()
{
statements1;//等待被执行的语句1
if(test)
recurs();//调用自身,体现递归思想
statements2;//等待被执行的语句2
}
分析:这里用分层思想更便于理解,首先执行statement1语句,然后判断是否符合test条件,如果符合,进入下一层recurs()调用,直到判断不符合条件为止(到这里为止,我们下面的statement2语句一次也没有被执行)。然后这里执行最底层的statement2语句,并将程序控制权返回给上一层的函数,上一层的函数继续执行statement2语句,依次类推,知道将控制权返回到最初的函数手里结束。
但是我们肯定会有这样的疑问:为什么不是一条counting down紧接着一条Kaboom,而是先输出完所有的counting down才输出Kaboom呢?
下面贴一段代码辅助理解:(代码来源:C++ primer plus)
#include <iostream>
using namespace std;
void countdown(int n)
{
cout<< "counting down..."<< n << endl;//statement1执行语句
if(n>0)
countdown(n-1);//递归,调用下一层contdown()函数
cout<< ":Kaboom!"<< n <<endl;;//statement2执行语句
}
int main()
{
countdown(4);
return 0;
}
从上图不难看出,对于测试语句1则是一口气执行到了头,对于测试语句2则是从最底层执行回到最高层(数字的排序就可看出来,语句一是从4到0,语句二是从0到4,正好相反)
案例二:
#include<iostream>
using namespace std;
//斐波那契数列
int c(int n){
if(n<=2)
return 1;
else
return c(n-2)+c(n-1);
}
int main(){
cout<<c(5)<<endl;
}
但是当我们把n=1换成n=2的时候,程序输出结果又会发生什么变化?
#include<iostream>
using namespace std;
//斐波那契数列
int fun(int n){
if(n<=2)
return 2;
else
return fun(n-2)+fun(n-1);
}
int main(){
cout<<fun(5)<<endl;
}
可以看到,结果竟然变成了原先的两倍,这其实和递归终止语句(if(n<=2) return 1;)有关,我们可以画出递归二叉树来理清关系,
红圈部分就是递归结束的标志,每一支末尾都返回一个值,加起来就变成了结果,所以上面变化的原因就不难理解了。这也从侧面印证了递归终止语句不止用来判断递归是否结束,还在求值过程中发挥重要作用。