- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第6章 zzh递归
(1)理解递归的定义和递归模型 (2)递归的执行过程 递归的执行过程由分解和求值两部分构成。 (3)递归设计的一般方法 递归的求解的过程均有这样的特征:先将整个问题划分为若干个子问题,通过分别求解子问题,最后获得整个问题的解。 分而治之的算法设计方法。 递归模型--递归算法--C/C++语言函数。 (4)消除递归的基本方法 消除:把递归算法转换为非递归算法. 把递归算法转化为非递归算法有如下三种基本方法: (1)对于尾递归和单向递归的算法,可用循环结构的算法替代。 (2)自己用栈模拟系统的运行时栈,通过分析只保存必须保存的信息,从而用非递归算法替代递归算法。 (3)利用栈保存参数,由于栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递归算法。 (5)运用递归算法解决一些较复杂应用问题 例:以下是求n!(n为正整数)的递归函数 例:采用递归算法求实数数组A[0..n-1]中的最小值 例:求1,2,…,n的全排列 例:采用递归算法求解皇后问题:在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。 if (top==0 St[top].tag==0) /*栈中只有一个已求出f的元素时退出循环*/ break; } return(St[top].f); } Ackerman函数的定义如下: akm(m,n)= n+1 m=0 akm(m-1,1) m≠0,n=0 akm(m-1,akm(m,n-1) m≠0,n ≠0 设计对应的非递归算法。 计算akm(2,1)的递归调用过程树 2.等价关系 等价关系是指“大问题”的求解过程转化为“小问题”求解而得到的,它们之间不是值的相等关系,而是解的等价关系。 例如,求梵塔问题对应的递归模型就是等价关系,也就是说,Hanoi(n,x,y,z)与Hanoi(n-1,x,z,y)、move(n,x,z)和Hanoi(n-1,y,x,z)是等价的。该问题完整的递归模型如下: Hanoi(n,x,y,z) ? 直接将x上的盘片从x移动到z上 当n=1时 (1) Hanoi(n,x,y,z) ? Hanoi(n-1,x,z,y); 将第n个圆盘从x移动到z上; Hanoi(n-1,y,x,z) 当n1时 (2) 对应的非递归求解过程如下: 定义一个栈; 将初始问题进栈; while (栈不空) { if (栈顶元素的tag==1) /*不能直接操作*/ { 将栈中元素出栈; 将Hanoi(n-1,y,x,z)进栈; 将“将第n个圆盘从x移动到z上”操作进栈; 将Hanoi(n-1,x,z,y)进栈; } if (栈顶元素满足递归出口条件) 直接操作并置tag=0; } 注意:上述过程中进栈的次序与(2)中三步的求解次序正好相反,这是由于Hanoi问题和栈的特点决定的。 非递归算法Hanoi()如下: void Hanoi1(int n,char x,char y,char z) { int n1,x1,y1,z1; if (n=0) { printf(参数错误\n); return; } else if (n==1) { printf(将%c上的1个盘片直接移动到%c\n,x,z); return; } top++; St[top].n=n; /*初值进栈*/ St[top].x=x; St[top].y=y; St[top].z=z; St[top].tag=1; while (top-1) /*栈不空循环*/ { if (St[top].tag==1 St[top].n1)
文档评论(0)