《数据结构C语言版》----第06章.ppt
《《数据结构C语言版》----第06章.ppt》由会员分享,可在线阅读,更多相关《《数据结构C语言版》----第06章.ppt(42页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、存在算法调用自己的情况:存在算法调用自己的情况:若一个算法直接的或间接的若一个算法直接的或间接的调用自己本身调用自己本身,则称这,则称这个算法是递归算法。个算法是递归算法。(1 1)问题的定义是递推的)问题的定义是递推的阶乘阶乘函数的函数的常见定义常见定义是:是:6.16.1递归的概念递归的概念2也可也可定义为:定义为:写成写成函数形式,则为:函数形式,则为:这种函数定义的方法是这种函数定义的方法是用阶乘函数自己本身定义了阶用阶乘函数自己本身定义了阶乘函数乘函数,称公式(称公式(63)是阶乘函数的)是阶乘函数的递推定义式递推定义式。3(2)问题的解法存在自调用)问题的解法存在自调用 一一个个典
2、典型型的的例例子子是是在在有有序序数数组组中中查查找找一一个个数数据据元元素素是是否否存在的存在的折半查找算法折半查找算法。4图图6-1 6-1 折半查找过程折半查找过程 56.26.2递归算法的执行过程递归算法的执行过程 例例6-1 6-1 给给出出按按照照公公式式6-36-3计计算算阶阶乘乘函函数数的的递递归归算算法法,并给出并给出n=3n=3时递归算法的执行过程。时递归算法的执行过程。设计:按照公式设计:按照公式6-36-3计算阶乘函数的递归算法如下:计算阶乘函数的递归算法如下:6longintFact(intn)intx;longinty;if(n0)/nhigh)return-1;/
3、查找不成功查找不成功mid=(low+high)/2;if(x=amid)returnmid;/查找成功查找成功elseif(xamid)returnBSearch(a,x,low,mid-1);/在下半区查找在下半区查找elsereturnBSearch(a,x,mid+1,high);/在上半区查找在上半区查找11测试主函数设计如下:测试主函数设计如下:#includemain(void)inta=1,3,4,5,17,18,31,33;intx=17;intbn;bn=BSearch(a,x,0,7);if(bn=-1)printf(x不在数组不在数组a中中);elseprintf(x在
4、数组在数组a的下标的下标%d中中,bn);12BSearch(aBSearch(a,x,0,7),x,0,7)的递归调用过程如图的递归调用过程如图6-36-3所示,所示,其中,其中,实箭头表示函数调用,虚箭头表示函数的返回值。实箭头表示函数调用,虚箭头表示函数的返回值。图图6-3 6-3 BSearch(aBSearch(a,x,0,7),x,0,7)的递归调用过程的递归调用过程 13146.36.3递归算法的设计方法递归算法的设计方法 递递归归算算法法既既是是一一种种有有效效的的算算法法设设计计方方法法,也也是是一一种种有有效效的的分析问题的方法。分析问题的方法。递递归归算算法法求求解解问问
5、题题的的基基本本思思想想是是:对对于于一一个个较较为为复复杂杂的的问问题题,把把原原问问题题分分解解成成若若干干个个相相对对简简单单且且类类同同的的子子问问题题,这这样样,原原问题就可递推得到解。问题就可递推得到解。15 适宜于用递归算法求解的问题的适宜于用递归算法求解的问题的充分必要条件是:充分必要条件是:(1 1)问题具有某种可借用的类同自身的子问题描述的性)问题具有某种可借用的类同自身的子问题描述的性质;质;(2 2)某一有限步的子问题(也称作本原问题)有直接的)某一有限步的子问题(也称作本原问题)有直接的解存在。解存在。当一个问题存在上述两个基本要素时,该问题的当一个问题存在上述两个基
6、本要素时,该问题的递归算递归算法的设计方法是:法的设计方法是:(1 1)把对原问题的求解设计成包含有对子问题求解的形)把对原问题的求解设计成包含有对子问题求解的形式。式。(2 2)设计递归出口。)设计递归出口。16例例6-3 6-3 设设计计模模拟拟汉汉诺诺塔塔问问题题求求解解过过程程的的算算法法。汉汉诺诺塔塔问问题题的的描描述述是是:设设有有3 3根根标标号号为为A A,B B,C C的的柱柱子子,在在A A柱柱上上放放着着n n个个盘盘子子,每每一一个个都都比比下下面面的的略略小小一一点点,要要求求把把A A柱柱上上的的盘盘子子全全部部移移到到C C柱柱上,上,移动的规则移动的规则是:是:
7、(1 1)一次只能移动一个盘子;)一次只能移动一个盘子;(2 2)移动过程中大盘子不能放在小盘子上面;)移动过程中大盘子不能放在小盘子上面;(3 3)在在移移动动过过程程中中盘盘子子可可以以放放在在A A,B B,C C的的任任意意一一个个柱柱子子上。上。17问题分析:问题分析:可以用递归方法求解可以用递归方法求解n n个盘子的汉诺塔问题。个盘子的汉诺塔问题。基本思想基本思想:1 1个盘子的汉诺塔问题可直接移动。个盘子的汉诺塔问题可直接移动。n n个盘子的汉个盘子的汉诺塔问题可递归表示为,首先把上边的诺塔问题可递归表示为,首先把上边的n-1n-1个盘子从个盘子从A A柱柱移到移到B B柱,然后
8、把最下边的一个盘子从柱,然后把最下边的一个盘子从A A柱移到柱移到C C柱,最后柱,最后把移到把移到B B柱的柱的n-1n-1个盘子再移到个盘子再移到C C柱。柱。4 4个盘子汉诺塔问题个盘子汉诺塔问题的递归求解示意图如图的递归求解示意图如图6-46-4所示。所示。18图图6-4 6-4 汉诺塔问题的递归求解示意图汉诺塔问题的递归求解示意图19算法设计:算法设计:首先,盘子的个数首先,盘子的个数n n是必须的一个输入参数,是必须的一个输入参数,对对n n个盘子个盘子,我们可从上至下依次编号为我们可从上至下依次编号为1,2,1,2,n,n;其次,输其次,输入参数还需有入参数还需有3 3个柱子的代
9、号个柱子的代号,我们令我们令3 3个柱子的参数名分别个柱子的参数名分别为为fromPegfromPeg,auxPegauxPeg和和toPegtoPeg;最后,汉诺塔问题的求解是一最后,汉诺塔问题的求解是一个处理过程,因此算法的输出是个处理过程,因此算法的输出是n n个盘子从柱子个盘子从柱子fromPegfromPeg借助借助柱子柱子auxPegauxPeg移动到柱子移动到柱子toPegtoPeg的移动步骤,我们设计每一步的移动步骤,我们设计每一步的移动为屏幕显示如下形式的信息:的移动为屏幕显示如下形式的信息:Move Disk i from Peg X to Peg YMove Disk i
10、 from Peg X to Peg Y 这样,汉诺塔问题的这样,汉诺塔问题的递归算法可设计如下:递归算法可设计如下:20voidtowers(intn,charfromPeg,chartoPeg,charauxPeg)if(n=1)/递归出口递归出口printf(%s%c%s%cn,movedisk1frompeg,fromPeg,topeg,toPeg);return;/把把n-1个圆盘从个圆盘从fromPeg借助借助toPeg移至移至auxPegtowers(n-1,fromPeg,auxPeg,toPeg);/把圆盘把圆盘n由由fromPeg直接移至直接移至toPegprintf(%s
11、%d%s%c%s%cn,movedisk,n,frompeg,fromPeg,topeg,toPeg);/把把n-1个圆盘从个圆盘从auxPeg借助借助fromPeg移至移至toPegtowers(n-1,auxPeg,toPeg,fromPeg);21测试主函数如下:测试主函数如下:#includevoidmain(void)Towers(4,A,C,B);程序运行的输出信息如下:程序运行的输出信息如下:22MoveDisk1fromPegAtoPegBMoveDisk2fromPegAtoPegCMoveDisk1fromPegBtoPegCMoveDisk3fromPegAtoPegBM
12、oveDisk1fromPegCtoPegAMoveDisk2fromPegCtoPegBMoveDisk1fromPegAtoPegBMoveDisk4fromPegAtoPegCMoveDisk1fromPegBtoPegCMoveDisk2fromPegBtoPegAMoveDisk1fromPegCtoPegAMoveDisk3fromPegBtoPegCMoveDisk1fromPegAtoPegBMoveDisk2fromPegAtoPegCMoveDisk1fromPegBtoPegC23 总结如下:总结如下:递归算法的执行过程是递归算法的执行过程是不断地自调用不断地自调用,直,
13、直到到达递归出口才结束自调用过程;到达递归出口后,递到到达递归出口才结束自调用过程;到达递归出口后,递归算法开始按归算法开始按最后调用的过程最先返回最后调用的过程最先返回的次序返回;返回的次序返回;返回到最外层的调用语句时递归算法执行过程结束到最外层的调用语句时递归算法执行过程结束。246.46.4递归过程和运行时栈递归过程和运行时栈对于非递归函数,调用函数在调用被调用函数前,系对于非递归函数,调用函数在调用被调用函数前,系统要统要保存保存以下两类以下两类信息信息:(1 1)调用函数的返回地址;)调用函数的返回地址;(2 2)调用函数的局部变量值。)调用函数的局部变量值。当执行完被调用函数,返
14、回调用函数前,系统首先要当执行完被调用函数,返回调用函数前,系统首先要恢复恢复调用函数的调用函数的局部变量值局部变量值,然后,然后返回返回调用函数的调用函数的返回返回地址地址。25 递归函数被调用时,系统要作的工作和非递归函递归函数被调用时,系统要作的工作和非递归函数被调用时系统要作的工作在数被调用时系统要作的工作在形式上类同形式上类同,但,但保存信息保存信息的方法不同的方法不同。递归函数被调用时,系统需要一个运行时栈递归函数被调用时,系统需要一个运行时栈.系统的系统的运行时栈也要保存上述两类信息。每一层递归调用所需运行时栈也要保存上述两类信息。每一层递归调用所需保存的信息构成运行时栈的一个工
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构C语言版 数据结构 语言版 06
限制150内