原来连续两次递归调用很简单.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

原来连续两次递归调⽤很简单

voidrec(intN){

//为了区分这两个递归,分别为它们取个别名好了

if(N0){

rec(N-1);//rec1

rec(N-10);//rec2

}

coutN=Nendl;

cout最后⼀句了endl;

}

第⼀步:前11次递归肯定是只有rec1进⾏递归⼊栈,这是⽏容置疑的,⼊栈之后就是下⾯这个样⼦了

第⼆步:rec1递归完之后,开始出栈。第⼀次出栈得到N=0,判断N是否满⾜递归条件,当然以后每次出栈之后都是要判断⼀次的,毕竟还

要进⾏⼀次递归。显然N=0不满⾜递归条件,直接跳到后⾯的两个cout语句去。这样就完成了第⼀次出栈操作。

第三步:rec1的第⼆次出栈,取到的元素是1,即N=1,注意这个时候并没有将栈顶元素1删除。在rec1处取到元素之后,继续往下执⾏,

到了rec2递归语句这⾥了,这个时候会中断rec1的出栈操作,转⽽去执⾏rec2的⼊栈操作,所以进⼊rec2递归⼊栈,此时⼊栈的元素是-

9(因为1-10=-9),很显然此时已经不满⾜再次⼊栈的条件了,那rec2会直接出栈,出栈元素就是-9,跳到后⾯的去执⾏cout语句,栈

的变化过程如下所⽰:

第四步:前⾯说到rec1是中断⾃⼰的操作去先执⾏rec2的,那么现在rec2执⾏完了,那rec1就可以继续它的出栈操作了,所以此时N的值

就变成了1,即N=1,然后继续往下执⾏,也就是执⾏到了cout操作,完成了rec1的第⼆次出栈操作。此时栈就变成了下⾯的样⼦了:

最后rec1完成第⼆次出栈后,继续执⾏rec1出栈操作,重复以上步骤。上⾯说了那么多,其实就是按代码来顺序执⾏。

下⾯的是出栈的⼊栈的过程:

⽤下⾯的代码来解释⼀下按代码顺序来执⾏是什么意思:

voidrec(intN){

if(N0){

rec(N-10);//rec1

rec(N-1);//rec2

}

coutN=Nendl;

cout最后⼀句了endl;

}

输出结果:

这段代码很明显,rec1每次都只能压栈1次,⽽且我们仔细观察输出结果会发现,前⾯的0~-9其实都是由rec1进⾏压栈和出栈的。究其原

因,前⾯说过了,是按代码顺序来执⾏的,rec2每次压栈之前都要经过if语句判断,然后执⾏rec1,⽽且是rec1先执⾏完,然后才能轮到

rec2;⽽到了后⾯0~9的输出,那是因为rec2后⾯直接就是cout语句了,⽽且出栈操作时,每次都是从需要出栈的语句(rec2)处开始往下

执⾏,所以是连续的输出0~9。

文档评论(0)

151****6399 + 关注
实名认证
文档贡献者

大专毕业生

1亿VIP精品文档

相关文档