2014年《数据结构C语言版》---第06章.pptVIP

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第6章 递归算法 *6.6递归算法到非递归算法的转换 有些问题需要用低级程序设计语言来实现,而低级程序设计语言(如汇编语言)一般不支持递归,此时需要采用问题的非递归结构算法。一般来说,存在如下两种情况的递归算法。 (1)存在不借助堆栈的循环结构的非递归算法,如阶乘计算问题、斐波那契数列的计算问题、折半查找问题等。这种情况,可以直接选用循环结构的算法。 (2)存在借助堆栈的循环结构的非递归算法,所有递归算法都可以借助堆栈转换成循环结构的非递归算法,如下边例6-4设计的汉诺塔问题的借助堆栈的循环结构的非递归算法。此时可以把递归算法转换成相应的非递归算法,有两种转换方法:一种方法是借助堆栈,用非递归算法形式化模拟递归算法的执行过程;另一种方法是根据要求解问题的特点,设计借助堆栈的循环结构算法。这两种方法都需要使用堆栈,这是因为堆栈的后进先出特点正好和递归函数的运行特点相吻合。下面讨论的例6-4是第二种情况下的第一种转换方法的例子 6.7设计举例 6.7.1 一般递归算法设计举例 例6-5 设计一个输出如下形式数值的递归算法。 n n n ... n ...... 3 3 3 2 2 1 问题分析:该问题可以看成由两部分组成:一部分是输出一行值为n的数值;另一部分是原问题的子问题,其参数为n-1。当参数减到0时不再输出任何数据值,因此递归的出口是当参数n≤0时空语句返回。 算法设计:递归算法设计如下: void Display(int n) { int i;? for(i = 1; i = n; i++) coutsetw(s)n; coutendl; ? if(n 0) Display(n - 1); //递归? //n=0为递归出口,递归出口为空语句 } 例6-6 设计求解委员会问题的算法。委员会问题是:从一个有n个人的团体中抽出k (k≤n)个人组成一个委员会,计算共有多少种构成方法。 问题分析:从n个人中抽出k(k≤n)个人的问题是一个组合问题。把n个人固定位置后,从n个人中抽出k个人的问题可分解为两部分之和:第一部分是第一个人包括在k个人中,第二部分是第一个人不包括在k个人中。对于第一部分,则问题简化为从n-1个人中抽出k-1个人的问题;对于第二部分,则问题简化为从n-1个人中抽出k个人的问题。图6-7给出了n=5, k=2时问题的分解示意图。 图6-7 委员会问题分解示意图 当n=k或k=0时,该问题可直接求解,数值均为1,这是算法的递归出口。因此,委员会问题的递推定义式为: int Comm(int n, int k) { if(n 1 || k 0 || k n) return 0; ? if(k == 0) return 1; if(n == k) return 1; return Comm(n-1, k-1) + Comm(n-1, k); } 例6-7 求两个正整数n和m最大公约数的递推定义式为: 要求: (1)编写求解该问题的递归算法; (2)分析当调用语句为Gcd(30, 4)时算法的执行过程和执行结果; (3)分析当调用语句为Gcd(97, 5)时算法的执行过程和执行结果; (4)编写求解该问题的循环结构算法。 解:(1)递归算法如下: int Gcd(int n, int m) { if(n 0 || m 0) exit(0); if(m == 0) return n; else if(m n) return Gcd(m, n); else return Gcd(m, n % m); } (2)调用语句为Gcd(30, 4)时,因mn,递归调用Gcd(4, 2);因mn,递归调用Gcd(2, 0);因m=0,到达递归出口,函数最终返回值为n=2,即30和4的最大公约数为2。 (3)调用语句为Gcd(5,97)时,因mn,递归调用Gcd(97, 5);因mn,递归调用Gcd(5, 2);因mn,递归调用Gcd(2, 1);因mn,递归调用Gcd(1, 0);因m=0,到达递归出口,函数最终返回

文档评论(0)

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

1亿VIP精品文档

相关文档