递归与回漱算法专题.pptVIP

  1. 1、本文档共23页,可阅读全部内容。
  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文档。上传文档
查看更多
递归与回漱算法专题

递归算法 胡苗坤 什么是递归 递归实例1 汉诺塔问题 新汉诺(hanoi)塔问题 N皇后问题 全排列 背包问题 组合问题 * 什么是递归?先看大家都熟悉的一个民间故事:从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说,从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说……。象这样,一个对象部分地由它自己组成,或者是按它自己定义,我们称之是递归。递归算法作为计算机程序设计中的一种重要的算法,是较难理解的算法之一。简单地说,递归就是编写这样的一个特殊的过程,该过程体中有一个语句用于调用过程自身(称为递归调用)。递归过程由于实现了自我的嵌套执行,使这种过程的执行变得复杂起来,其执行的流程可以用图所示。 例如,我们可以这样定义N!,N!=N*(N-1)!,因此求N!转化为求 (N-1)!。这就是一个递归的描述。 因此,可以编写如下递归程序: program Factorial; var N: Integer; T: Longint; function Fac(N: Integer): Longint; begin if N = 0 then Fac := 1 else Fac := N * Fac(N - 1) end; begin Write(N = ); Readln(N); T := Fac(N); Writeln(N! = ,T); end. 下图展示了N=3的执行过程。由上述程序可以看出,递归是一个反复执行直到递归终止的过程。 递归有如下特点: ①它直接或间接的调用了自己。 ②一定要有递归终止的条件,这个条件通常称为边界条件。 与递推一样,每一个递推都有其边界条件。但不同的是,递推是由边界条件出发,通过递推式求f(n)的值,从边界到求解的全过程十分清楚;而递归则是从函数自身出发来达到边界条件,在通过边界条件的递归调用过程中,系统用堆栈把每次调用的中间结果(局部变量和返回地址)保存起来,直至求出递归边界值f(0)=a。然后返回调用函数。返回的过程中,中间结果相继出栈恢复,f(1)=g(1,a)?f(2)=g(2,f(1))?……?直至求出f(n)=g(n,f(n-1))。 递归按其调用方式分 直接递归——递归过程P直接自己调用自己; 间接递归——即P包含另一过程D,而D又调用P; ?由此可见,递归算法的效率往往很低,费时和费内存空间。但是递归也有其长处,它能使一个蕴含递归关系且结构复杂的程序简洁精炼,增加可读性。特别是在难于找到从边界到解的全过程的情况下,如果把问题进一步,其结果仍维持原问题的关系,则采用递归算法编程比较合适。 递归算法适用的一般场合为: ① 数据的定义形式按递归定义。 如裴波那契数列的定义: 对应的递归程序为 function fib(n: Integer): Integer; begin if n = 0 then fib := 1 {递归边界} else if n = 1 then fib := 2 {递归边界} else fib := fib(n – 2) + fib(n – 1); {递归} end; ② 数据之间的关系(即数据结构)按递归定义。如树的遍历,图的搜索等。 ③ 问题解法按递归算法实现。例如回溯法等。 对于②和③,可以用堆栈结构将其转换为非递归算法,以提高算法的效率以及减少内存空间的浪费。 有n个圆盘,依半径大小(半径都不同)自下而上套在a柱上,每次只允许移动最上面一个圆盘到另外的柱子上去(除a柱外,还有b柱和c柱,开始时这两个柱子上无圆盘),但绝不允许发生柱子上出现大盘子在上,小盘子在下的情况,现要求设计将a柱上的n个圆盘搬移到c柱的方法。 分析:这个移动过程很复杂与烦琐,但规律性却很强。使用递归调用技术来解决这个移动过程,先得找到一个递归调用模型。想要得到汉诺塔问题的简单解法,着眼点应该是移动A杆最底部的大盘,而不是其顶部的小盘。不考虑64个盘而考虑N个盘的一般情况。要想将A杆上的N个盘移至C杆,我们可以这样设想:   1.以C盘为临时杆,从A杆将1至N-1号盘移至B杆。   2.将A杆中剩下的第N号盘移至C杆。   3.以A杆为临时杆,从B杆将1至N-1号盘移至C杆。 我们看到,步骤2只需移动一次就可以完成;步骤1与3的操作则完全相同, 唯一区别仅在于各杆的作用有所不同。这样,原问题被转换为与原问题相同性质的、规模小一些的新问题(如图)。即: HANOI(N,A,B,C) 可转化为 HANOI(N-1,A,C,B)与 HANOI(N-1,B,A,B) 其

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档