算法与结构课件第二章递归(华北电力大学科技学院).ppt
《算法与结构课件第二章递归(华北电力大学科技学院).ppt》由会员分享,可在线阅读,更多相关《算法与结构课件第二章递归(华北电力大学科技学院).ppt(58页珍藏版)》请在三一办公上搜索。
1、计算机算法设计与分析,North China Electric Power University,Computer Algorithms Design&Analysis,华北电力大学计算机科学与工程系,Dept.of Computer Science&Engineering of North China Electric Power University,第二章 递归(Recursion),递归的概念,递归算法的应用和实现,递归问题的非递归算法,North China Electric Power University,递归方程渐进阶的求法,生成函数,1 递归的概念,North China E
2、lectric Power University,一个直接或间接调用自身的算法称为递归算法。一个使用函数自身给出定义的函数称为递归函数。,例 阶乘函数 阶乘函数的定义为:,n!=,1 n=0,n(n-1)!n0,定义式的左右两边都引用了阶乘记号,是一个递归定义式,可递归地定义如下:,int Factorial(int n)if(n=0)return 1;return n*Factorial(n-1);,2 递归算法的应用和实现,如果问题的数据结构是递归的,问题的定义是递归的,问题的解法是递归的,可以考虑用递归算法。,看下面的数据结构:,Head,Head,这是单链表,每个结点有两个域:数据域和
3、指针域。它是一种递归的结构,可定义为:1)一个结点,其指针域为null,是一个单链表;2)一个结点,其指针域为有效指针指向一个单链表,仍是一个 单链表。,1)问题的数据结构是递归的,North China Electric Power University,若存在如上定义的一个单链表,现要实现打印最后一个结点的数据域的值,可用下面递归过程:,template class link_list Type data;link_list*next;template void search1(link_list*h)if(h-next=null)coutdata;else search1(h-next)
4、;,North China Electric Power University,North China Electric Power University,二叉树(Binary Tree)也是一种递归的数据结构,其递归定义为:1)它是一棵空树;2)它是由一个根结点和两棵分别称为左右子树的二叉树构成。,要遍历一棵二叉树可以采用下面的递归算法:,void Traverse(Bitptr*t)if(t!=null)coutdata;Traverse(t-lchild);Traverse(t-rchild);,North China Electric Power University,例:Fibona
5、cci数列 无穷数列1,1,2,3,5,8,13,21,34,55,称为Fibonacci数列。它可以递归地定义为:,Fib(n)=,1 n=0,1 n=1,Fib(n-1)+Fib(n-2)n1,第n个Fibonacci数可递归地计算如下:int Fibonacci(int n)if(n=1)return 1;return Fibonacci(n-1)+Fibonacci(n-2);,上述两例中的函数也可用如下非递归方式定义:,n!=1*2*3*(n-1),2)问题的定义是递归的,North China Electric Power University,例:整数划分问题,将一个正整数n表示
6、成一系列正整数之和,n=n1+n2+nk,其中n1n2nk 1,k 1正整数n的一个这种表示称为正整数n的一个划分。正整数n的不同划分个数称为正整数n的划分数,记做p(n)。,如正整数6有如下11种不同的划分,所以p(6)=11。6;5+1;4+2,4+1+1;3+3,3+2+1,3+1+1+1;2+2+2,2+2+1+1,2+1+1+1+1,1+1+1+1+1+1;,3)问题的解法是递归的,North China Electric Power University,在正整数n的所有不同的划分中,将最大加数n1不大于m的划分个数记作q(n,m)。我们可以建立如下递归关系:1)q(n,1)=1,
7、n1;当最大加数n1不大于1时,任何正整数n只有一种划分形式。2)q(n,m)=q(n,n),mn;最大加数n1实际上不能大于n,因此,q(n,m)=q(n,n)。3)q(n,n)=1+q(n,n-1);正整数n的划分由n1=n和n1n-1的划分组成。4)q(n,m)=q(n,m-1)+q(n-m,m),nm1;正整数n的最大加数n1不大于m的划分由n1=m的划分和 n1 m-1的划分组成。以上的关系实际上给出了计算q(n,m)的递归式如下:,q(n,m)=,1 m=1,q(n,n)nm,1+q(n,n-1)n=m,q(n,m-1)+q(n-m,m)nm1,0 n1或m1,递归算法的设计方法,
8、递归算法既是一种有效的算法设计方法,也是一种有效的分析问题的方法。递归算法求解问题的基本思想是:对于一个较为复杂的问题,把原问题分解成若干个相对简单且类同的子问题,这样,原问题就可递推得到解。适宜于用递归算法求解的问题的充分必要条件是:(1)问题具有某种可借用的类同自身的子问题描述的性质;(2)某一有限步的子问题(也称作本原问题)有直接的解存在。当一个问题存在上述两个基本要素时,该问题的递归算法的设计方法是:(1)把对原问题的求解设计成包含有对子问题求解的形式。(2)设计递归出口。,例 设计模拟汉诺塔问题求解过程的算法。汉诺塔问题的描述是:设有3根标号为A,B,C的柱子,在A柱上放着n个盘子,
9、每一个都比下面的略小一点,要求把A柱上的盘子全部移到C柱上,移动的规则是:(1)一次只能移动一个盘子;(2)移动过程中大盘子不能放在小盘子上面;(3)在移动过程中盘子可以放在A,B,C的任意一个柱子上。,问题分析:可以用递归方法求解n个盘子的汉诺塔问题。,基本思想:1个盘子的汉诺塔问题可直接移动。n个盘子的汉诺塔问题可递归表示为,首先把上边的n-1个盘子从A柱移到B柱,然后把最下边的一个盘子从A柱移到C柱,最后把移到B柱的n-1个盘子再移到C柱。4个盘子汉诺塔问题的递归求解示意图如图6-4所示。,图6-4 汉诺塔问题的递归求解示意图,Y,X,Z,以三个盘为例:,A,B,C,算法设计:首先,盘子
10、的个数n是必须的一个输入参数,对n个盘子,我们可从上至下依次编号为1,2,n;其次,输入参数还需有3个柱子的代号,我们令3个柱子的参数名分别为fromPeg,auxPeg和toPeg;最后,汉诺塔问题的求解是一个处理过程,因此算法的输出是n个盘子从柱子fromPeg借助柱子auxPeg移动到柱子toPeg的移动步骤,我们设计每一步的移动为屏幕显示如下形式的信息:Move Disk i from Peg X to Peg Y这样,汉诺塔问题的递归算法可设计如下:,void towers(int n,char fromPeg,char toPeg,char auxPeg)if(n=1)/递归出口p
11、rintf(%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 disk,n,from peg,fromPeg,to peg,toPeg);/把n-1个圆盘从auxPeg借助fromPeg移至toPegtowers(n-1,auxPeg,toPeg,fromPeg);,测试主函数如下:#include vo
12、id main(void)Towers(4,A,C,B);程序运行的输出信息如下:,Move Disk 1 from Peg A to Peg BMove Disk 2 from Peg A 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
13、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 from 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,总结如下:递归算法的执行过程是不断地自调用,直到到达递归出口才结束自调用过程;到达递归出口后,递归算法开始按最后调用的过程最先返回的次序返回;返回到最外层的调用语句时递归算法执行过程结
14、束。,代码,递归过程的实现,对于非递归函数,调用函数在调用被调用函数前,系统要保存以下两类信息:(1)调用函数的返回地址;(2)调用函数的局部变量值。当执行完被调用函数,返回调用函数前,系统首先要恢复调用函数的局部变量值,然后返回调用函数的返回地址。递归函数被调用时,系统要作的工作和非递归函数被调用时系统要作的工作在形式上类同,但保存信息的方法不同。,递归函数被调用时,系统的运行时栈也要保存上述两类信息。每一层递归调用所需保存的信息构成运行时栈的一个工作记录,在每进入下一层递归调用时,系统就建立一个新的工作记录,并把这个工作记录进栈成为运行时栈新的栈顶;每返回一层递归调用,就退栈一个工作记录。
15、因为栈顶的工作记录必定是当前正在运行的递归函数的工作记录,所以栈顶的工作记录也称为活动记录。,设计举例,一般递归算法设计举例,例1 设计一个输出如下形式数值的递归算法。n n n.n.3 3 3 2 21,问题分析:该问题可以看成由两部分组成:一部分是输出一行值为n的数值;另一部分是原问题的子问题,其参数为n-1。当参数减到0时不再输出任何数据值,因此递归的出口是当参数n0时空语句返回。算法设计:递归算法设计如下:void Display(int n)int i;for(i=1;i 0)Display(n-1);/递归/n=0为递归出口,递归出口为空语句,代码,例6-6 设计求解委员会问题的算
16、法。委员会问题是:从一个有n个人的团体中抽出k(kn)个人组成一个委员会,计算共有多少种构成方法。问题分析:从n个人中抽出k(kn)个人的问题是一个组合问题。把n个人固定位置后,从n个人中抽出k个人的问题可分解为两部分之和:第一部分是第一个人包括在k个人中,第二部分是第一个人不包括在k个人中。对于第一部分,则问题简化为从n-1个人中抽出k-1个人的问题;对于第二部分,则问题简化为从n-1个人中抽出k个人的问题。图6-7给出了n=5,k=2时问题的分解示意图。,图6-7 委员会问题分解示意图,当n=k或k=0时,该问题可直接求解,数值均为1,这是算法的递归出口。因此,委员会问题的递推定义式为:,
17、int Comm(int n,int k)if(n n)return 0;if(k=0)return 1;if(n=k)return 1;return Comm(n-1,k-1)+Comm(n-1,k);,例6-7 求两个正整数n和m最大公约数的递推定义式为:,要求:(1)编写求解该问题的递归算法;(2)分析当调用语句为Gcd(30,4)时算法的执行过程和执行结果;(3)分析当调用语句为Gcd(97,5)时算法的执行过程和执行结果;(4)编写求解该问题的循环结构算法。,解:(1)递归算法如下:int Gcd(int n,int m)if(n n)return Gcd(m,n);else ret
18、urn Gcd(m,n%m);(2)调用语句为Gcd(30,4)时,因mn,递归调用Gcd(4,2);因mn,递归调用Gcd(2,0);因m=0,到达递归出口,函数最终返回值为n=2,即30和4的最大公约数为2。,(3)调用语句为Gcd(5,97)时,因mn,递归调用Gcd(97,5);因mn,递归调用Gcd(5,2);因mn,递归调用Gcd(2,1);因mn,递归调用Gcd(1,0);因m=0,到达递归出口,函数最终返回值为n=1,即5和97的最大公约数为1。(4)编写求解该问题的循环结构算法,代码,Fib n:3 f1:1 f2:1 f:2,Fib n:2 f1:1 f2:0 f:1,Fi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 结构 课件 第二 递归 华北 电力大学 科技学院
链接地址:https://www.31ppt.com/p-6012015.html