第5章-递归数据结构课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第5章-递归数据结构课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 数据结构 课件
- 资源描述:
-
1、2023-2-1612023-2-162n!=1 n=0n*(n-1)!n0 若一个对象部分地包含它自己或用它自己给自己定义,则称这个对象是递归的。若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。*测试终结递归的条件 递归出口 *n问题化为n-1问题(或着大问题化为小问题)2023-2-1632023-2-1642023-2-1652023-2-1662023-2-167例2.查找非空单链表中值为x的结点,并输出之。templatevoid print(listnode*f)if(f!=null)if(f data=x)coutf dataendL;else print(f lin
2、k);2023-2-168n2023-2-1692023-2-16102023-2-16113.递归过程的实现 以上两个例子以及迷宫问题可以看到 1)递归程序十分短,十分简练,但读起来不容易.2)有很多工作由编译程序做了,编译程序要开辟:参数栈 ,局部变量栈,返回地址栈函数名,引用参数,数值参数 2023-2-16125.4 利用栈实现的迷宫问题的非递归解法数据结构:1.迷宫用二维数组表示 mazemp,但在迷宫外面加一个圈,为墙壁.Mazem+2p+2 即行数:0m+1;列数:0p+1 1 1 1 1 1 1 0 0 1 0 0 1 mazeij=0 表示该位置是通路 1 1 0 1 0 1
3、 mazeij=1 墙壁 1 0 1 0 1 1 入口:maze11 1 1 0 1 1 1 出口:mazemp 1 0 1 1 0 0 1 1 1 1 1 12023-2-16132.从ij位置,前进的方向有8个,可测探。i-1j-1 i-1j i-1j+1 ij-1 ij ij+1 i+1j-1 i+1j i+1j+1 8个方向用枚举类型来表示:enum directionsN,NE,E,SE,S,SW,W,NW3.向8个方向移动,其坐标位置要变化,具体实现放其偏移量,即:2023-2-1614Offset move8struct offsets int a,b;例如,若当前位置为ij,向
4、西南SW方向移动,则下一相邻位置gh为:g=i+moveSW.a;h=j+moveSW.b这里要指出的是,用枚举类型中的数组作为下标变量,这是一个技巧.实际上枚举类型在机内实现为整型数N-10NE-11E01SE11S10SW1-1ab.move2023-2-1615 4.为了防止重走老路,另外又建立了一个标志矩阵markm+2 p+2,初始化时都为0,一旦走到迷宫的某个位置ij,则得 markij置为1.表示下次这个位置不能再走了。mark与maze 矩阵大小一一对应.5.设立一个栈,存储在试探过程中所走过的路径,一旦要回溯,则从栈中取得刚才走过位置的坐标和前进方向.栈中需保存一个三元组 x
5、 y dir struct items 坐标 方向 int x,y,dir;2023-2-16166.具体实现算法 1.mark11=1;/11是入口 2.stackst(m*p);/开辟工作栈,大小为m*p 3.items tmp;/设一工作结构变量 tmp.x=1;tmp.y=1;tmp.dir=E;st.push(tmp);4.while(!st.IsEmpty()1)tmp=st.pop();2)int i=tmp.x;int j=tmp.y;int d=tmp.dir2023-2-1617 3)while(d=0)个表元素a0,a1,a2,an-1组成的有限序列。记作:LS=(a0,
6、a1,a2,an-1)其中每个表元素ai可以是原子,也可以是子表。原子:某种类型的对象,在结构上不可分。(用小写字母表示)子表:有结构的。(用大写字母表示)*广义表的长度:表中元素的个数2023-2-1619 *广义表的表头(head)、表尾(tail)head=a0;tail=(a1,a2,an-1)LS=(a,(b,a,b),(),c,(2)*广义表的深度:表中所含括号的最大层数 1)A=();2)B=(6,2)3)C=(a,(5,3,x)表头为a,表尾为(5,3,x)4)D=(B,C,A)5)E=(B,D)6)F=(4,F)递归的表2023-2-1620 2)广义表的性质 有序性 有长度
7、,有深度 可递归,如上面例6 可共享,如E中B为E,D所共享 各种广义表都可用一种示意图来表示,用 表示表元素,表示原子 A62Ba53xC2023-2-1621DBCA62a53xEBDCA62a53xF42023-2-16223)广义表的操作例子:list1=(5,12,s,47,a)head(list)/取第一个元素 tail(list)/tail(list1)=(12,s,47,a)first(list)/返回广义表第一个元素的指针 info(elem)/返回由elem指向的广义表节点的值 next(elem)/返回由elem指向的下一个节点的指针 nodetype(elem)/返回由
8、elem指向的广义表节点的类型 push(list,x)/将值为x的节点加入到广义表list的最前端 addon(list,x)/建立以x为头,list为尾的新表 setinfo(elem,x)/将表元素elem的值修改为x sethead(list,x)/将list的头元素重置为x2023-2-1623 4)广义表的存储结构 用数组存储显然不合适,因数组元素不同构 用拉链,但各元素类型不一致;用不等长节点不好.用等长节点来表示,每个表节点用三个域组成.标志域 值域 尾指针 utype value tlink2023-2-1624 utype=0:广义表专用的表头结点 1:整型原子结点 2:字
9、符型原子结点 3:子表节点 值域随着不同类型的节点,存放不同的内容,并用不同的名字来表示,实际上value部分可变的,用union实现.utype=0,ref:存放引用计数 utype=1,intgrinfo:存放整数值 utype=2,charinfo:存放字符型数据 utype=3,hlink:指向子表表头的指针2023-2-1625 tlink:当utype=0,tlink指向该表(表可以是子表)第一个元素的结点 当utype!=0,tlink指向该值域同一层的下一个表结点 例子:L=(3,(),(b,c),(d)utype ref tlink L 0 L 1 3 3 3 3 0 0 2
展开阅读全文