c++递归中语句的执行顺序是怎样的?

案例一: 

  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;)有关,我们可以画出递归二叉树来理清关系,

 

红圈部分就是递归结束的标志,每一支末尾都返回一个值,加起来就变成了结果,所以上面变化的原因就不难理解了。这也从侧面印证了递归终止语句不止用来判断递归是否结束,还在求值过程中发挥重要作用。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ad_m1n

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值