第三讲递归与回溯法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三讲递归与回溯法

第三讲 递归与回溯法 一、递归的概念 什么是递归?先看大家都熟悉的一个民间故事:从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说,从前有座山,山上有座庙,庙里有一个老和尚在给小和尚讲故事,故事里说……。象这样,一个对象部分地由它自己组成,或者是按它自己定义,我们称之是递归。 例如,我们可以这样定义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. 图3-1展示了N=3的执行过程。由上述程序可以看出,递归是一个反复执行直到递归终止的过程。 设一个未知函数f,用其自身构成的已知函数g来定义: 为了定义f(n),必须先定义f(n-1),为了定义f(n-1),又必须先定义f(n-2) ,… 一个函数、过程、概念或数学结构,如果在其定义或说明内部又直接或间接地出现有其本身的引用,则称它们是递归的或者是递归定义的。在程序设计中,过程或函数直接或者间接调用自己,就被称为递归调用。 递归过程是借助于一个递归工作栈来实现的,问题向一极推进,这一过程叫做递推;问题逐一解决,最后回到原问题,这一过程叫做回归。递归的过程正是由递推和回归两个过程组成。 递归有如下特点: ①它直接或间接的调用了自己。 ②一定要有递归终止的条件,这个条件通常称为边界条件。 与递推一样,每一个递推都有其边界条件。但不同的是,递推是由边界条件出发,通过递推式求f(n)的值,从边界到求解的全过程十分清楚;而递归则是从函数自身出发来达到边界条件,在通过边界条件的递归调用过程中,系统用堆栈把每次调用的中间结果(局部变量和返回地址)保存起来,直至求出递归边界值f(0)=a。然后返回调用函数。返回的过程中,中间结果相继出栈恢复,f(1)=g(1,a)(f(2)=g(2,f(1))(……(直至求出f(n)=g(n,f(n-1))。 由此可见,递归算法的效率往往很低,费时和费内存空间。但是递归也有其长处,它能使一个蕴含递归关系且结构复杂的程序简洁精炼,增加可读性。特别是在难于找到从边界到解的全过程的情况下,如果把问题进一步,其结果仍维持原问题的关系,则采用递归算法编程比较合适。 递归算法适用的一般场合为: ① 数据的定义形式按递归定义。 如裴波那契数列的定义: 对应的递归程序为 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; 这类递归问题可转化为递推算法,递归边界为递推的边界条件。例如上例转化为递推算法即为 unction fib(n: Integer): Integer; begin f[0] := 1; f[1] := 2; {递推边界} for I := 2 to n do f[I] := f[I – 1] + f[I – 2]; fib := f(n); end; ② 数据之间的关系(即数据结构)按递归定义。如树的遍历,图的搜索等。 ③ 问题解法按递归算法实现。例如回溯法等。 对于②和③,可以用堆栈结构将其转换为非递归算法,以提高算法的效率以及减少内存空间的浪费。 下面以经典的N皇后问题为例,看看递归法是怎样实现的,以及比较递归算法和非递归算法效率上的差别。 二、应用举例 例1、楼梯有N级台阶,上楼可以一步上一阶,也可以一步上二阶。编一递归程序,计算共有多少种不同走法? 提示:如N级楼梯有S(N)种不同走法,则有: S(N)=S(N-2)+S(N-1) 输入:N 输出:所有的走法 例2、新汉诺(hanoi)塔问题 设有n各大小不等的中空圆盘,按从小到大的顺序从1到n编号。将这n个圆盘任意的迭套在三根立柱上,立柱的编号分别为A、B、C,这个状态称之为初始状态。问题要求找到一种步数最少的移动方案

文档评论(0)

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

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

1亿VIP精品文档

相关文档