- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3.3递归 (栈的应用) * 1. 递归的定义 2. 基本思想 3. 递归要素 3. 递归应用举例 阶乘函数 汉诺塔问题 3.3 递归 1、递归(recursion)的定义 递归:子程序(或函数)直接调用自己或通过一系列调用语句间接调用自己,是一种描述问题和解决问题的基本方法。 。 递归按其调用方式可分为直接递归和间接递归: 1、直接递归:自己调用自己。如: void f(n) {…… f(n/2); …… } 2、间接递归:P调用D,D调用P; 如: void P(int n) void D(int n) { …… { …… D(n/3); P(n/2); …… …… } } 2、 递归的基本思想 问题分解:把一个不能或不好解决的大问题转化为一个或几个小问题,再把这些小问题进一步分解成更小的小问题,直至每个小问题都可以直接解决。 3 、递归的要素 ⑴ 递归边界条件:确定递归到何时终止,也称为递归出口; ⑵ 递归模式:大问题是如何分解为小问题的,也称为递归体。 例1、定义是递归的: (1)阶乘函数 递归算法 long unsigned fact (int n){ if(n==0) return 1; else return n*fact (n-1); } - * = 时 当 时 当 )! 1 ( 1 ! n≥1 n=0 n n n 4、递归应用举例 求解阶乘 n! 的过程 计算 fact(4) 计算 4*fact(3) 计算 3*fact(2) 计算 2*fact(1) 计算 fact(1) 递归调用 回归求值 返回 24 返回 6 返回 2 返回1 (2)Fibonacci数列 0 n=0 Fib(n)= 1 n=1 Fib(n-1)+Fib(n-2) n1 0 1 1 2 3 5 8 13 …… 递归算法 long unsigned Fib(int n) { if (n==0||n==1) return n;//递归出口 else return Fib(n-1)+Fib(n-2);//递归调用 } 注:累计递归调用次数:2*Fib(n+1)-1。 例2、问题的解法是递归的: 利用递归思想来求解某类问题(本身没有明显的递归结构,但操作方法可以用递归很好的描述)使其更为简单。 如:汉诺塔问题、背包问题、八皇后问题等。 (3)有的数据结构如二叉树、广义表、图等(如树的遍历、图的搜索)定义。 经典问题——汉诺塔问题 在世界刚被创建的时候有一座钻石宝塔(塔A),其上有64个金碟。所有碟子按从大到小的次序从塔底堆放至塔顶。紧挨着这座塔有另外两个钻石宝塔(塔B和塔C)。从世界创始之日起,婆罗门的牧师们就一直在试图把塔A上的碟子移动到塔C上去,其间借助于塔B的帮助。每次只能移动一个碟子,任何时候都不能把一个碟子放在比它小的碟子上面。当牧师们完成任务时,世界末日也就到了。 汉诺塔问题的递归求解方法: 如果 n = 1,则将这一个盘子直接从 塔A移到塔 C 上。否则,执行以下三步: ⑴ 将塔A上的n-1个碟子借助塔C先移到塔B上; ⑵ 把塔A上剩下的一个碟子移到塔C上; ⑶ 将n-1个碟子从塔B借助于塔A移到塔C上。 算法实现: void Hanoi(int n, char A, char B, char C) {?? if (n==1) Move(A, C); ???? else {?????????????? Hanoi(n-1, A, C, B); ???? Move(A, C); ????????? Hanoi(n-1, B, A, C);?????????????? }??????? } Hanio(3,A,B,C) Hanio(2,A,C,B) Hanio(1,A,B,C) Move (A,C) Move (A,B) Hanio(1,C,A,B) Hanio(1,A,B,C) Hanio(2,A,C,B) Move (C,B) Hanio(1,C,A,B) Move (A,C) Hanio(2,B,A,C) Hanio(1,B,C,A) Move (B,C) Hanio(1,A,B,C) Hanio(1,B,C,A) Move (A,C) Hanio(2,B,A,C) Move (B,A) Hanio(1,A,B,C) 结束 汉诺塔递归调用过程: 5
原创力文档


文档评论(0)