第6章 递归算法.ppt
《第6章 递归算法.ppt》由会员分享,可在线阅读,更多相关《第6章 递归算法.ppt(43页珍藏版)》请在麦多课文档分享上搜索。
1、1,第6章 递归算法,递归的概念 递归算法的执行过程 递归算法的设计方法 递归过程和运行时栈 递归算法的效率分析 设计举例,主要知识点,2,存在算法调用自己的情况:,若一个算法直接的或间接的调用自己本身,则称这个算法是递归算法。,(1)问题的定义是递推的,阶乘函数的常见定义是:,6.1递归的概念,3,也可定义为:,写成函数形式,则为:,这种函数定义的方法是用阶乘函数自己本身定义了阶乘函数,称公式(6 3)是阶乘函数的递推定义式。,4,(2)问题的解法存在自调用,一个典型的例子是在有序数组中查找一个数据元素是否存在的折半查找算法。,5,6,6.2递归算法的执行过程,例6-1 给出按照公式6-3计
2、算阶乘函数的递归算法,并给出n = 3时递归算法的执行过程。设计:按照公式6-3计算阶乘函数的递归算法如下:,7,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; ,8,设计主函数如下,void main(void) long int fn;fn = Fact(3); ,主函数用实参n= 3调用了递归算法Fact(3),而Fact(3)要通过调用Fact(2)
3、、Fact(2)要通过调用Fact(1)、Fact(1)要通过调用Fact(0)来得出计算结果。Fact(3)的递归调用过程如图6-2所示。,9,图6-2 Fact(3)的递归调用执行过程,10,例6-2 给出在有序数组a中查找数据元素x是否存在的递归算法,并给出如图6-1所示实际数据的递归算法的执行过程。递归算法如下:,11,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; /查找
4、成功else if(x amid)return BSearch(a, x, low, mid-1); /在下半区查找elsereturn BSearch(a, x, mid+1, high); /在上半区查找 ,12,测试主函数设计如下: # 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); ,13,BSearch(a, x,
5、0,7)的递归调用过程如图6-3所示,其中,实箭头表示函数调用,虚箭头表示函数的返回值。,图6-3 BSearch(a, x, 0,7)的递归调用过程,14,15,6.3递归算法的设计方法,递归算法既是一种有效的算法设计方法,也是一种有效的分析问题的方法。递归算法求解问题的基本思想是:对于一个较为复杂的问题,把原问题分解成若干个相对简单且类同的子问题,这样,原问题就可递推得到解。,16,适宜于用递归算法求解的问题的充分必要条件是:(1)问题具有某种可借用的类同自身的子问题描述的性质;(2)某一有限步的子问题(也称作本原问题)有直接的解存在。当一个问题存在上述两个基本要素时,该问题的递归算法的设
6、计方法是:(1)把对原问题的求解设计成包含有对子问题求解的形式。(2)设计递归出口。,17,例6-3 设计模拟汉诺塔问题求解过程的算法。汉诺塔问题的描述是:设有3根标号为A,B,C的柱子,在A柱上放着n个盘子,每一个都比下面的略小一点,要求把A柱上的盘子全部移到C柱上,移动的规则是:(1)一次只能移动一个盘子;(2)移动过程中大盘子不能放在小盘子上面;(3)在移动过程中盘子可以放在A,B,C的任意一个柱子上。,18,问题分析:可以用递归方法求解n个盘子的汉诺塔问题。基本思想:1个盘子的汉诺塔问题可直接移动。n个盘子的汉诺塔问题可递归表示为,首先把上边的n-1个盘子从A柱移到B柱,然后把最下边的
7、一个盘子从A柱移到C柱,最后把移到B柱的n-1个盘子再移到C柱。4个盘子汉诺塔问题的递归求解示意图如图6-4所示。,19,图6-4 汉诺塔问题的递归求解示意图,20,算法设计:首先,盘子的个数n是必须的一个输入参数,对n个盘子,我们可从上至下依次编号为1,2,n;其次,输入参数还需有3个柱子的代号,我们令3个柱子的参数名分别为fromPeg,auxPeg和toPeg;最后,汉诺塔问题的求解是一个处理过程,因此算法的输出是n个盘子从柱子fromPeg借助柱子auxPeg移动到柱子toPeg的移动步骤,我们设计每一步的移动为屏幕显示如下形式的信息:Move Disk i from Peg X to
8、 Peg Y这样,汉诺塔问题的递归算法可设计如下:,21,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移至auxPegtowers(n-1,fromPeg,auxPeg,toPeg); /把圆盘n由fromPeg直接移至toPegprintf(“%s%d%s%c%s%cn“, “move d
9、isk “, n, “ from peg “, fromPeg, “ to peg “, toPeg); /把n-1个圆盘从auxPeg借助fromPeg移至toPegtowers(n-1,auxPeg,toPeg,fromPeg); ,22,测试主函数如下: #include void main(void) Towers(4, A, C, B); 程序运行的输出信息如下:,23,Move Disk 1 from Peg A to Peg B Move Disk 2 from Peg A to Peg C Move Disk 1 from Peg B to Peg C Move Disk 3
10、from Peg A to Peg B Move Disk 1 from Peg C to Peg A Move Disk 2 from Peg C to Peg B Move Disk 1 from Peg A to Peg B Move Disk 4 from Peg A to Peg C Move Disk 1 from Peg B to Peg C Move Disk 2 from Peg B to Peg A Move Disk 1 from Peg C to Peg A Move Disk 3 from Peg B to Peg C Move Disk 1 from Peg A t
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 算法 PPT
