收藏 分享(赏)

数据结构2_第6章_1.ppt

上传人:nacm35 文档编号:6923262 上传时间:2019-04-27 格式:PPT 页数:18 大小:169.50KB
下载 相关 举报
数据结构2_第6章_1.ppt_第1页
第1页 / 共18页
数据结构2_第6章_1.ppt_第2页
第2页 / 共18页
数据结构2_第6章_1.ppt_第3页
第3页 / 共18页
数据结构2_第6章_1.ppt_第4页
第4页 / 共18页
数据结构2_第6章_1.ppt_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、第六章 递归算法,掌握: 递归的概念:什么是递归,种类,及递归求解方法 递归过程的机制与利用递归工作栈实现递归的方法 利用递归解决问题的分治法和回溯法了解: 迷宫问题的递归思路及利用栈实现的非递归解法,一、递归的概念定义: 若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;而且一个过程直接地或间接地调用自己,则称这个过程是递归的过程。,应用: (1)用于某些概念的定义: 阶乘: if ( n0 ) n ! = n ( n-1 ) !if ( n=0 ) n ! = 1 单链表结点:typedef struct nodedatatype datastruct node *

2、Link;slnode 二叉树:二叉树是数据元素的有穷集合,它或者为空集(空 二叉树), 或者由一个根元素和其下的两棵互不相交的二叉树(左子树和右子树)构成。,递归算法的一般形式:void p (参数表) if (递归结束条件)可直接求解步骤;-基本项else p(较小的参数);-归纳项,递归算法的优点:易编程、可读性好、易检验可用归纳思维方法来理解和检验递归算法,但有一个基本条件和两个步骤:基本条件:规格说明必须严格、精确地规定算法的功能、入 / 出口信息、对外层量或全局量的影响步骤一:归纳基始验证算法对于最简单情况(递归出口)的正确性步骤二:由归纳假设进行归纳假设算法中的递归调用 能正确实

3、现规格说明之规定,然后验证整个算法能否实现规格说明之规定,例:求n! =long Factorial(long n)if (n=0) return 1;else return n*Factorial(n-1);,1, n=0 n*(n-1)! n0,Factorial(4);,例5-3:有5人坐在一起,问第5号人多少岁?他说比第4号人大2岁,问第4号人他又说比第3号人大2岁,依次下去,问到最后一个人,他说他已10岁,请问第5号人多大?10 n=1f(n)= f(n-1)+2 n1int age (int n) int c;if (n=1) return 10;else return age(n

4、-1)+2; ,二分查询,例:在n个以排好序(设为从小到大)的数据中(数或字符串)中,查询某一个数据。如果找到了,就指出其在n个数中的位置;否则给出无该数据的信息,如给出“1”。 (1)问题分析:当问题的规模较大时,可以将问题分为同类型的规模较小的问题,第归的进行求解。采用二分法求解本问题的基本思路是:设数列为a1,a2,an,被查找的数为x,则查找首先对am(m=(n+1)/2)进行,于是得到如下三种情形:若x am ,则x可能在区间 am1, an;若x am ,则x可能在区间 a1, am-1 ;若x= am,则am即为查找的数,求解结束。,用递归函数实现上述查找:定义递归函数binsr

5、ch(s,r,x) ,s是所要搜索数列的起始下标,r是终止下标,x为所要搜索的值。在binsrch函数中实现这样的功能:首先查找am=(n+1)/2和x的关系。如果xam ,那么就递归调用binsrch(m+1,r,x),否则如果x am 那么就递归调用binsrch(r,m-1,x),否则如果x= am ,那么就输出当前m的值,并返回,再否则就返回1,代表数列中没有与x相等的数。,6.3 递归算法的设计方法,Hanoi汉诺塔问题。有三根针A,B,C,针上有64个盘子,盘子大小不等,大的在下,小的在上。要求把这64个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘子,且移动过

6、程中有三根针上都保持大盘在下,小盘在上。要求编程序来实现。实现本题的三个步骤: 借C针将A针上的n-1盘子移到B针 将A针上的盘子移到C针 借A针将B针上的n-1盘子移到C针,将A针上的盘子移到C针 n=1f(n)= 将n-1个盘从一针移到另一针上 n1,例 Hanoi问题,void move(char getone, char putone) printf(“%c-%cn“,getone,putone); void hanoi(int n,char one,char two,char three) if(n=1) move(one,three);else hanoi(n-1,one,thre

7、e,two);move(one,three);hanoi(n-1,two,one,three); main() int m;printf(“Input the number of disks:“);scanf(“%d“, ,运行结果: 只有一个盘子的情况:(最简1步) Input the number of disks: 1 The step to moving 1 disks A-C 有二个盘子的情况:(最简3步) Input the number of disks: 2 The step to moving 2 disks A-B A-C B-C 有三个盘子的情况:(最简7步) Input

8、 the number of disks:3 The step to moving 3 disks A-C B-A A-B B-C C-B A-C A-C,6.4 递归过程与运行时栈,为了保证递归调用的正确性,需要保存调用点的现场(返回地 址、局部变量、被调用函数的参数等),以便正确地返回,并且按 先进后出的原则来管理这些信息。在高级语言(编译程序)中,是 通过利用“递归工作栈”来实现递归调用的。f(n) f(n-1) f(n-2) f(1) f(0)调用时执行入栈操作保存现场,返回时执行出栈操作恢复现场,计算 4 ! 递归过程图示:,下图中 Pi 代表现场信息,栈元素由现场信息和参数构成f(

9、4)=4*f(3) f(3)=3*f(2) f(2)=2*f(1) f(1)=1*f(0) f(0)=1 Push(e4) Push(e3) Push(e2) Push(e1)f(4)= 4 * f(3) f(3)= 3 *f(2) f(2)= 2 *f(1) f(1)= 1 * f(0)一般来说,递归方法的执行效率较低,但编程效率较高,因此 常用来构建快速原型。另外递归结构一般可以转化成循环结构(有 时需要栈操作的配合)。试实现上述阶乘计算的转化(要求用栈)。,Pop(e1),Pop(e2),Pop(e3),Pop(e4),6.5 递归算法的效率分析,long fib(int n) if (

10、n=0|n=1) return nelse return fib(n-1)+fib(n-2);,一般从递归过程改为非递归过程的方法是先根据递归算法 画出程序流程图,然后建立循环结构。,long Fib(long n) if (n=1) return n;f0=0, f1=1; for (i=2; i=n; i+) f2 =f1 +f0;f0=f1; f1=f2;return f2;,Fib(6) n=6 0、1、,3、,5、,8,2、,1、,6.7 设计举例 例 6-5 : void display (int n) int i;for (i=1;i0) display (n-1);,例6-6: int comm(int n, int k) if (nn) return 0;if (k=0) return 1;if (n=k) return 1;return comm(n-1,k-1)+comm(n-1,k);,例6-7: int gcd(int n, int m) if (nn) return gcd(m,n);else return gcd(m,n%m); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报