- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四章 堆栈的应用2
递 归 递归(Recurve)的概念 基本递归过程 递归过程的实现 --堆栈与递归 从方法论意义上说,递归方法是一种从简单到复杂、从低级到高级的可连续操作的解决问题的方法。 在人们的思维过程中,普遍存在着递归现象和递归机制。 对于某些问题,只能用递归方法来处理;对于某些问题,用递归方法处理比其他方法更有效。 什么是递归 xn=x*x*…*x*x (n个x连乘) xn+1=xn * x S(n)=1+2+3+…+(n-1)+n S(n+1)=S(n)+(n+1) 优点:直观、有效 定义:如果一个对象部分地包含它自己,或者利用自己定义自己的方式来定义或描述,则称这个对象是递归的;如果一个过程直接或间接地调用自己,则称这个过程是一个递归过程。 组成:递归调用、递归终止条件 例2.3 计算数组 A 中最大最小元素的算法BS 。 算法BS(A ,i ,j . fmax ,fmin) // 在数组A的第i个元素到第j个元素之间寻 //找最大和最小元素,已知i ? j 。 BS1 [递归出口] IF i = j THEN ( fmax←fmin←A[i]. RETURN. ) IF i = j ? 1 THEN ( IF A[i] A[j] THEN (fmax←A[j].fmin←A[i] . ) ELSE(fmax←A[i]. fmin←A[j] . ) RETURN). BS2 [取中值] mid← BS3 [递归调用] BS(A,i,mid. gmax,gmin) BS(A,mid+1,j. hmax,hmin). BS4 [合并] fmax←max{gmax,hmax}. fmin←min{gmin,hmin}. ■ 递归方法的理论基础是数学归纳法。 递归出口 ? 归纳基础 递归调用 ? 归纳步骤 汉诺塔问题 对于n阶汉诺塔进行一下分析: 1.把n个盘子从上到下编号1……n,要把n个盘子从a塔移动到c塔,首先借用c塔作为存放盘子的临时塔,把上面的n-1个盘子移动到b塔; 2.把第n个盘子移动到c塔; 3.那么如何把第n-1个盘子移动到c? 可以把a作为临时塔,把第n-1个盘子上面的n-2个盘子从b移动到a,把第n-1个盘子移动到c。这样n-2个盘子又回到了a上; 4.以此类推,下面n-2个盘子的移动仿佛是在重复第1、2步操作,这个问题变成了典型的递归问题。 基本递归过程 递归过程在实现时,发生递归调用:分为内部调用和外部调用。 调用方式不同,返回的方式也不相同。 递归调用正确进行:调用时参数传递正确 过程结束正确返回:返回地址正确 在高级语言(编译程序)中,是利用“递归工作栈”来实现递归调用的。 f(n) f(n-1) f(n-2) f(1) f(0) 调用时执行入栈操作保存现场,返回时执行出栈操作恢复现场 层层向下递归,退出时的次序正好相反: 递归次序 n! (n-1)! (n-2)! 1! 0!=1 返回次序 工作记录: 返回地址 参 数 (函数名、引用参数与数值参数等) 局部变量 函数递归时的活动记录 long Factorial ( long n ) { if ( n == 0 ) return 1; else return n * Factorial (n-1); RetLoc2 } void main ( ) { int Result; Result = Factorial (4); RetLoc1 } 递归方法虽然在解决某些问题时是最直观、最方便的方法,但却不是一种高效的方法,主要原因在于递归方法过于频繁的函数调用和参数传递。 在这种情况下,若采用循环或递归算法的非递归实现,将会大大提高算法的执行效率。 首先,进行递归式的思考需要练习。虽然迭代能很自然
文档评论(0)