未用--递与归程序执行过程 .pptVIP

  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文档。上传文档
查看更多
未用--递与归程序执行过程

* 8.4.4 递归程序执行过程 递归程序写起来简单、风格也优美。但是,执行时能得到正确的结果吗?回答是肯定的,这是由 C 系统保证的。 C系统在执行函数调用时,按右图所示步骤进行(凡是允许递归的程序设计语言在执行函数调用时,都按这个步骤进行)。 其中,关键是“开辟新的运行环境”和“释放本函数的运行环境”两步。所谓运行环境,就是本函数运行时所需要的存储空间(形式参数单元、局部变量单元、临时变量单元等)、以及为了保存(调用本函数之前)程序运行的现场所需要的空间等。 开辟新的运行环境 保存现场 参数结合 执行 分程序 恢复现场 释放本函数的运行环境 返回 为了简洁,目前我们仅涉及: 本函数值单元 返回地址单元 本函数的形式参数单元区 本函数的局部变量单元区 本函数的临时变量单元区 由于每次调用函数时,都在新的运行环境下运行,保证了存储单元不发生冲突,从而也就保证了递归程序执行的正确性。为了加深对递归程序的理解,我们再举一个递归程序的例题,并观察它的执行过程。 【例7-11】从前 n 个自然数 1 , 2 , 3 , ... , n 中取 r 个数作组合,打印全部所有组合。例如,n=5 、r=3 ,便有如下10种组合。 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5 解本题的一般想法是使用 r 重循环 for ( i1 = 1 ; i1 =n-r+1 ; i1 ++ ) for ( i2 = i1+1 ; i2 = n-r+2 ; i2 ++ ) ... ... for ( ir = ir-1+1 ; ir = n ; ir ++ ) 印( i1 , ... , ir ) 但是,由于 r 是可变的,所以循环嵌套层数亦是可变的,因此不知道应该用多少个 i 。我们只好从另一角度上想问题,自然想到递归。 从前 n 个自然数 1 , 2 , 3 , ... , n 中取 r 个数作组合的问题可以分解成: 先分别取这 n 个数中的一个数i(只需要在前 n-r+1 个数中取 i ); 然后从该 i 后边的 n-i+1 个数 i+1 , i+2 , ... , n 中取 r-1 个数作组合; 最后把每组 r-1 个数的组合与前边的 i 合并,从而构成 r 个数的组合。 当然,从 i 后取 r-1 个数作组合的问题还可以用同样的方法来分解。 我们设想,若有一个函数 combination ( s , j ) 能够完成从自然数子序列 s , s+1 , s+2 , ... , n 中取 j 个数作组合,则我们的原始问题可以写成函数调用: combination ( 1 , r ) 而我们的第一步分析算法则可以写成: for i = 1 TO n-r+1 DO combination ( i+1 , r-1 ) 把该算法抽象化,并考虑递归出口(当j=1时,就不必再继续递归下去,只需打印已经形成的组合),得到函数: void combination ( int s, int j ) { int i ; for ( i=s ; i=n-j+1 ; i++ ) if ( j1 ) combinatien( i+1 , j-1 ) else 打印每层递归进入本函数时的 i } 主程序中说明变量 n 、r ;输入 n 、r 后,以语句combination(1,r)调用该函数,就是我们的分析算法,也就得到前边的r重循环程序。 该程序无法在第 r 层递归调用时,访问(打印)前边诸层调用时的局部量i 。显然每层的i必须: 或者在本层调用时打印; 或者用一个全局数组变量,

文档评论(0)

qiwqpu54 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档