- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]算法设计与分析第二章
计算机算法设计与分析 第二章递归与分治 递归的思想 递归(Recursion)就是通过把复杂问题分解为较简单的同一问题来求解。 递归求解问题的方法通常有两步: 第一步是考虑最简单的情况下该问题如何求解。 第二步是考虑该问题的较复杂情况是如何由较简单的所构成的。 由此得出该问题求解的方法。 Hanoi塔问题 Hanoi塔问题:有A、B、C三根柱子。A上有n个圆盘,自下而上由大到小地叠在一起。 Hanoi塔问题 让我们先考虑最简单的情况: 1、若没有盘子(n = 0),自然不需要做任何事情。 Hanoi塔问题 让我们先考虑最简单的情况: 1、若没有盘子(n=0),自然不需要做任何事情。 Hanoi塔问题 现在来考虑复杂的情况,即n 1的情况。 Hanoi塔问题 于是我们有了解决n 1的的策略: Hanoi塔问题 于是我们有了解决n 1的的策略: Hanoi塔问题 于是我们有了解决n 1的的策略: Hanoi塔问题 于是我们有了解决n 1的的策略: Hanoi塔问题 我们用Fr、To和As分别表示源柱、目标柱和辅助柱,解Hanoi塔可以描写为这样的递归过程: 1、若n = 0,什么也不做; Hanoi塔问题 若写成C语言,解Hanoi塔可以描写为这样的递归过程: void Hanoi(int n, int Fr, int To, int As) { if (n 0) { Hanoi(n–1, Fro, Ass, To); Move(Fro, To); Hanoi(n–1, Ass, To, Fro); } } Hanoi塔问题 Hanoi(3, A, B, C) Hanoi塔问题的时间复杂性 不难证明Hanoi塔问题的时间复杂性为O(2n)。 证明:对n归纳证明移动次数move(n) = 2n – 1。 归纳基础:当n = 1, move(1) = 1 = 21 – 1。 归纳假设:当n ? k, move(n) = 2n – 1。 归纳步骤:当n = k + 1,移动次数为 move(k+1) = 2(move(k)) + 1 = 2(2k – 1) + 1 = 2k+1 – 1 由归纳法可知对任意的n有move(n) = 2n – 1。 递归的概念 简单地说,递归就是用自己来定义自己。 递归元 递归思想是将对较大规模的对象的操作归结为对较小规模的对象实施同样的操作。 这种规模的变化体现在递归的参数表中的一类(一个或几个)变元上,这类变元被称之为递归元。 在递归定义中递归元的变化应导致递归计算终止,即逐步变化为最简单规模的计算。 在递归算法的设计中递归元是非常重要的。 常见的递归形式 除基本的递归形式外,其它常见的递归形式有四种,它们是: 多变元递归 多变元递归就是递归元多于一个的递归。 例如,求最大公约数的辗转相除法: 多步递归 若递归函数f(x, y),其中y是递归元,不仅与f(x, y–1)有关,而且与f(x, y–2),……,乃至f(x, 0)有关,则称为多步递归。 例如Fibonacci函数: 嵌套递归 所谓嵌套递归是指递归调用中又含有递归调用,又称为多重递归。 例如Ackermann函数: 联立递归 联立递归是同时定义几个函数,它们彼此相互调用,从而形成递归,又称间接递归。 例如Hilbert图案,下面为H1,H2和H3: Hilbert图案 将Hi记为Ai,将Hi旋转90°, 180°和270°后的图形分别记为Bi,Ci和Di,其中一、二级曲线如下所示: Hilbert图案 于是得出这些子曲线逐级间的关系如下: Hilbert图案 递归方法小结 递归方法是将复杂问题分解为较为简单的子问题的组合,且子问题与原问题相似。 递归算法中必有一个或几个最简情况的计算(非递归分支),若缺少或者不完备将造成递归不终止。 递归算法中递归元必须随递归的进程变化到最简情况,保证导致非递归分支的计算。 递归算法具有层次性,低层的解组合成高层的解。各层间最好通过参数传递来交流信息,如使用全局量,则要注意全局量的及时修订。 递归复杂性的一般形式 一般的,递归复杂性可描述为递归方程: 递归复杂性的一般形式 一般的,递归复杂性可描述为递归方程: 分治法的时间复杂性 分析分治法,即用除法递减,的递归方程的一般情形,可得其时间复杂性函数为: 分治法的基本思想 将一个规模为n的问题分解为a个规模较小的子问题,这些子问题互相独立并且与原问题相同。 递归地求解这些子问题问题。 然后将各个子问题的解合并在一起,从而得到原问
文档评论(0)