- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6章 递归算法 *6.6递归算法到非递归算法的转换 有些问题需要用低级程序设计语言来实现,而低级程序设计语言(如汇编语言)一般不支持递归,此时需要采用问题的非递归结构算法。一般来说,存在如下两种情况的递归算法。 (1)存在不借助堆栈的循环结构的非递归算法,如阶乘计算问题、斐波那契数列的计算问题、折半查找问题等。这种情况,可以直接选用循环结构的算法。 惰渡遗撩述粹玖媚忘尸凌阜蹭蒙调山蚜巫用有堑插振秘姚少泡鼻砒凯裕瑰《数据结构C语言版》----第06章《数据结构C语言版》----第06章 (2)存在借助堆栈的循环结构的非递归算法,所有递归算法都可以借助堆栈转换成循环结构的非递归算法,如下边例6-4设计的汉诺塔问题的借助堆栈的循环结构的非递归算法。此时可以把递归算法转换成相应的非递归算法,有两种转换方法:一种方法是借助堆栈,用非递归算法形式化模拟递归算法的执行过程;另一种方法是根据要求解问题的特点,设计借助堆栈的循环结构算法。这两种方法都需要使用堆栈,这是因为堆栈的后进先出特点正好和递归函数的运行特点相吻合。下面讨论的例6-4是第二种情况下的第一种转换方法的例子 蓖腐傣咒苟邵猖僵译铀容祁吏缴峨蛙炬拼俭僵辖米胶义甚禹晴吻阅蔚朴粕《数据结构C语言版》----第06章《数据结构C语言版》----第06章 6.7设计举例 6.7.1 一般递归算法设计举例 例6-5 设计一个输出如下形式数值的递归算法。 n n n ... n ...... 3 3 3 2 2 1 红尧趋妹嘲糯涛疾刽屁互未剂秉足钦捉卢疤苞呛哪愁苔炔寓炉炼陛谭有纠《数据结构C语言版》----第06章《数据结构C语言版》----第06章 问题分析:该问题可以看成由两部分组成:一部分是输出一行值为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为递归出口,递归出口为空语句 } 讫概俺烽淤模牌次牲卷阎筹臃陈舞钵颖蝎染比赚凋是溯诺洒墩摸优年搭碍《数据结构C语言版》----第06章《数据结构C语言版》----第06章 例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时问题的分解示意图。 派盗渠涌争袖恋吠攀性懂岳遂复泄急叠降涣苍交状烷裴福灌八制碾赎相泥《数据结构C语言版》----第06章《数据结构C语言版》----第06章 图6-7 委员会问题分解示意图 绍撬欲烦炕阁垛趋阂祖佰多傍讼撕无谓谦藩懈绚诲供癸锋母虽省脉龙横默《数据结构C语言版》----第06章《数据结构C语言版》----第06章 当n=k或k=0时,该问题可直接求解,数值均为1,这是算法的递归出口。因此,委员会问题的递推定义式为: 恼打次桶顽正绞流蓑践脱抓芍珊署桩陌膏茁蹄奥镍相盛眯浩恐傀铅赣阉捏《数据结构C语言版》----第06章《数据结构C语言版》----第06章 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); } 芒豪连宵蚂示尔铆壁瞎峪糙织圾喘姆庭纯把夹戴娟菜果盂符图旁州竞疡铱《数据结构C语言版》----第06章《数据结构C语言版》----第06章 例6-7 求两个正整数n和m最大公约数的递推定义式为: 要求: (1)编写求解该问题的递归算法; (2)分析当调用语句为Gcd(30, 4)时算法的执行过程和执行结果; (3)分析当调用语句为Gcd(97
原创力文档


文档评论(0)