算法设计与分析-递归算法.ppt
《算法设计与分析-递归算法.ppt》由会员分享,可在线阅读,更多相关《算法设计与分析-递归算法.ppt(56页珍藏版)》请在三一办公上搜索。
1、第6章 递归算法,1,6.1 递归的概念6.2 递归算法的执行过程6.3 递归算法的设计方法6.4 递归过程和运行时栈6.5 递归算法的效率分析6.6 递归算法到非递归算法的转换6.7 设计举例,6.1递归的概念,一、在日常生活中,递归一词较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。,2,德罗斯特效应(英语:Droste effect)是递归的一种视觉形式。图中女性手持的物体中有一幅她本人手持同一物体的小图片,进而小图片中还有更小的一幅她手持同一物体的图片,依此类推。,3,二、在数学与计算机科学中,递归是指在函数的定义中使
2、用函数自身的方法。例:第5个人的年龄比第4个的年龄大2岁,有4个人的年龄比第3个的年龄大2岁,有3个人的年龄比第2个的年龄大2岁,有2个人的年龄比第1个的年龄大2岁,第1个的年龄10岁。,4,例:阶乘的定义。,5,6,在下面二种情况中存在算法调用自己的情况:,(1)问题的定义是递推的,阶乘函数的常见定义是:,7,也可定义为:,写成函数形式,则为:,这种函数定义的方法是用阶乘函数自己本身定义了阶乘函数,称上式为阶乘函数的递推定义式。,8,(2)问题的解法存在自调用,一个典型的例子是在有序数组中查找一个数据元素是否存在的折半查找算法。如下例中查找元素17。,mid=(low+high)/2,9,6
3、.2递归算法的执行过程,例6-1 给出按照阶乘函数的递推定义式计算阶乘函数的递归算法,并给出n=3时递归算法的执行过程。设计:按照阶乘函数的递推定义式计算阶乘函数的递归算法如下:,long int Fact(int n)int x;long int y;if(n 0)/n 0时阶乘无定义 printf(“参数错!”);return-1;if(n=0)return 1;else y=Fact(n-1);/递归调用 return n*y;,10,为说明该递归算法的执行过程,设计调用过程如下:,void main(void)long int fn;fn=Fact(3);,上述代码用实参n=3调用了递
4、归算法Fact(3),而Fact(3)要通过调用Fact(2)、Fact(2)要通过调用Fact(1)、Fact(1)要通过调用Fact(0)来得出计算结果。Fact(3)的递归调用过程如下图所示,其中,黑色实线箭头表示函数调用,绿色虚线箭头表示函数返回,此函数在返回时函数名将带回返回值。,11,main()fn=Fact(3),Fact(3)y=Fact(2)return 3*y,Fact(2)y=Fact(1)return 2*y,递归调用的执行过程:,Fact(1)y=Fact(0)return 1*y,Fact(0)return 1,12,例6-2 给出在有序数组a中查找数据元素x是否
5、存在的递归算法,并给出折半查找示意图所示实际数据的递归算法的执行过程。设计:算法的参数包括:有序数组a,要查找的数据元素x,数组下界下标low,数组上界下标high。当在数组a中查找到数据元素x时函数返回数组a的下标;当在数组a中查找不到数据元素x时函数返回-1。,13,递归算法如下:,int BSearch(int a,int x,int low,int high)int mid;if(low high)return-1;/查找不成功mid=(low+high)/2;if(x=amid)return mid;/查找成功else if(x amid)return BSearch(a,x,low
6、,mid-1);/在下半区查找elsereturn BSearch(a,x,mid+1,high);/在上半区查找,14,测试代码设计如下:#include main(void)int a=1,3,4,5,17,18,31,33;int x=17;int bn;bn=BSearch(a,x,0,7);if(bn=-1)printf(x不在数组a中);else printf(x在数组a的下标%d中,bn);,15,BSearch(a,x,0,7)的递归调用过程如下图所示,其中,实箭头表示过程调用,虚箭头表示过程的返回值。,BSearch(a,x,0,7)mid=3 return BSearch(
7、a,x,4,7),main()x=17 bn=BSearch(a,x,0,7),BSearch(a,x,4,7)mid=5 return BSearch(a,x,4,4),BSearch(a,x,4,4)mid=4 return 4,16,6.3递归算法的设计方法,递归算法既是一种有效的算法设计方法,也是一种有效的分析问题的方法。递归算法求解问题的基本思想是:对于一个较为复杂的问题,把原问题分解成若干个相对简单且类同的子问题,这样较为复杂的原问题就变成了相对简单的子问题;而简单到一定程度的子问题可以直接求解;这样,原问题就可递推得到解。,17,并不是每个问题都适宜于用递归算法求解。适宜于用递归
8、算法求解的问题的充分必要条件是:(1)问题具有某种可借用的类同自身的子问题描述的性质;(2)某一有限步的子问题(也称作本原问题)有直接的解存在。,18,当一个问题存在上述两个基本要素时,设计该问题的递归算法的方法是:(1)把对原问题的求解设计成包含有对子问题求解的形式。(2)设计递归出口。,19,例6-3 设计模拟汉诺塔问题求解过程的算法。汉诺塔问题的描述是:设有3根标号为A,B,C的柱子,在A柱上放着n个盘子,每一个都比下面的略小一点,要求把A柱上的盘子全部移到C柱上,移动的规则是:(1)一次只能移动一个盘子;(2)移动过程中大盘子不能放在小盘子上面;(3)在移动过程中盘子可以放在A,B,C
9、的任意一个柱子上。问题分析:可以用递归方法求解n个盘子的汉诺塔问题。,20,基本思想:1个盘子的汉诺塔问题可直接移动。n个盘子的汉诺塔问题可递归表示为,首先把上边的n-1个盘子从A柱移到B柱,然后把最下边的一个盘子从A柱移到C柱,最后把移到B柱的n-1个盘子再移到C柱。4个盘子汉诺塔问题的递归求解示意图如下图所示。,21,原柱 A 辅助柱 B 目标柱 C,22,算法设计:首先,盘子的个数n是必须的一个输入参数,对n个盘子,我们可从上至下依次编号为1,2,n;其次,输入参数还需有3个柱子的代号,我们令3个柱子的参数名分别为fromPeg,auxPeg和toPeg;最后,汉诺塔问题的求解是一个处理
10、过程,因此算法的输出是n个盘子从柱子fromPeg借助柱子auxPeg移动到柱子toPeg的移动步骤,我们设计每一步的移动为屏幕显示如下形式的信息:Move Disk i from Peg X to Peg Y这样,汉诺塔问题的递归算法可设计如下:,23,void towers(int n,char fromPeg,char toPeg,char auxPeg)if(n=1)/递归出口 printf(%s%c%s%cn,move disk 1 from peg,fromPeg,to peg,toPeg);return;/把n-1个圆盘从fromPeg借助toPeg移至auxPeg towers
11、(n-1,fromPeg,auxPeg,toPeg);/把圆盘n由fromPeg直接移至toPeg printf(%s%d%s%c%s%cn,move disk,n,from peg,fromPeg,to peg,toPeg);/把n-1个圆盘从auxPeg借助fromPeg移至toPeg towers(n-1,auxPeg,toPeg,fromPeg);,24,测试代码如下:#include void main(void)Towers(4,A,C,B);程序运行的输出信息如下:,25,Move Disk 1 from Peg A to Peg BMove Disk 2 from Peg A
12、to Peg CMove Disk 1 from Peg B to Peg CMove Disk 3 from Peg A to Peg BMove Disk 1 from Peg C to Peg AMove Disk 2 from Peg C to Peg BMove Disk 1 from Peg A to Peg BMove Disk 4 from Peg A to Peg CMove Disk 1 from Peg B to Peg CMove Disk 2 from Peg B to Peg AMove Disk 1 from Peg C to Peg AMove Disk 3 f
13、rom Peg B to Peg CMove Disk 1 from Peg A to Peg BMove Disk 2 from Peg A to Peg CMove Disk 1 from Peg B to Peg C,26,结合本节和6.2节的讨论,我们可总结如下:递归算法的执行过程是不断地自调用,直到到达递归出口才结束自调用过程;到达递归出口后,递归算法开始按最后调用的过程最先返回的次序返回;返回到最外层的调用语句时递归算法执行过程结束。,27,6.4递归过程和运行时栈,对于非递归函数,调用函数在调用被调用函数前,系统要保存以下两类信息:(1)调用函数的返回地址(从而能执行下一语句);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 递归
链接地址:https://www.31ppt.com/p-6012082.html