数据结构第05章(清华殷人昆版)学习教案.pptx
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《数据结构第05章(清华殷人昆版)学习教案.pptx》由会员分享,可在线阅读,更多相关《数据结构第05章(清华殷人昆版)学习教案.pptx(61页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1数据结构数据结构(sh j ji u)第第05章章(清华清华 殷人昆版殷人昆版)第一页,共61页。递归的概念递归的概念(ginin)n n递归的定义递归的定义 若一个对象部分若一个对象部分地包含它自己地包含它自己(zj),或用或用它自己它自己(zj)给自己给自己(zj)定义定义,则称这个对象是递归则称这个对象是递归的;若一个过程直接地或间的;若一个过程直接地或间接地调用自己接地调用自己(zj),则称这则称这个过程是递归的过程。个过程是递归的过程。n n以下三种情况常常用到递归以下三种情况常常用到递归方法。方法。n n 定义是递归的定义是递归的n n 数据结构是递归的数据结构是递归的n
2、n 问题的解法是递归的问题的解法是递归的第1页/共61页第二页,共61页。定义定义(dngy)是递是递归的归的求解求解(qi ji)阶乘函数的递归算阶乘函数的递归算法法long Factorial(long n)if(n=0)return 1;else return n*Factorial(n-1);例如例如例如例如(lr)(lr),阶乘函数,阶乘函数,阶乘函数,阶乘函数第2页/共61页第三页,共61页。求解阶乘求解阶乘(ji chn)n!的过程的过程主程序主程序主程序主程序 main:fact(4)参数参数 4 计算计算(j sun)4*fact(3)返回返回 24参数参数(cnsh)3 计
3、算计算 3*fact(2)返回返回 6参数参数 2 计算计算 2*fact(1)返回返回 2参数参数 1 计算计算 1*fact(0)返回返回 1参数参数 0 直接定值直接定值=1 返回返回 1参参参参数数数数传传传传递递递递结结结结果果果果返返返返回回回回递递递递归归归归调调调调用用用用回回回回归归归归求求求求值值值值第3页/共61页第四页,共61页。数据结构数据结构(sh j(sh j ji u)ji u)是递归的是递归的n n 一个一个一个一个(y)(y)(y)(y)结点,它的指针域为结点,它的指针域为结点,它的指针域为结点,它的指针域为NULLNULLNULLNULL,是一个,是一个,
4、是一个,是一个(y)(y)(y)(y)单链表单链表单链表单链表;n n 一个一个一个一个(y)(y)(y)(y)结点,它的指针域指向结点,它的指针域指向结点,它的指针域指向结点,它的指针域指向单链表,仍是一个单链表,仍是一个单链表,仍是一个单链表,仍是一个(y)(y)(y)(y)单链表。单链表。单链表。单链表。例如例如例如例如(lr)(lr),单链表结构,单链表结构,单链表结构,单链表结构f f 第4页/共61页第五页,共61页。搜索链表最后搜索链表最后搜索链表最后搜索链表最后(zuhu)(zuhu)(zuhu)(zuhu)一个结点并打印一个结点并打印一个结点并打印一个结点并打印其数值其数值其
5、数值其数值template template template template void Print(ListNode*f)void Print(ListNode*f)void Print(ListNode*f)void Print(ListNode*f)if(f-link=NULL)if(f-link=NULL)if(f-link=NULL)if(f-link=NULL)cout data endl;cout data endl;cout data endl;cout data link);else Print(f-link);else Print(f-link);else Print(f
6、-link);f f f f f a0a1a2a3a4递归找链尾第5页/共61页第六页,共61页。在链表中寻找等于给定值的结点在链表中寻找等于给定值的结点在链表中寻找等于给定值的结点在链表中寻找等于给定值的结点(ji(ji didi n)n)并打印其数值并打印其数值并打印其数值并打印其数值template template void Print(ListNode*f,Type&x void Print(ListNode*f,Type&x)if(f!=NULL)if(f!=NULL)if(f-data=x)if(f-data=x)cout data endl;cout data link,x);
7、else Print(f-link,x);f f f f 递归找含x值的结点(ji din)x第6页/共61页第七页,共61页。问题的解法是递归的问题的解法是递归的 例如,汉诺塔例如,汉诺塔(Tower of Hanoi)问问题的解法:题的解法:如果如果 n=1,则将这一个盘子,则将这一个盘子(pn zi)直接从直接从 A 柱移到柱移到 C 柱上。柱上。否则,执行以下三步:否则,执行以下三步:用用 C 柱做过渡,将柱做过渡,将 A 柱上柱上的的(n-1)个盘子个盘子(pn zi)移到移到 B 柱柱上:上:将将 A 柱上最后一个盘子柱上最后一个盘子(pn zi)直接移到直接移到 C 柱上;柱上;
8、用用 A 柱做过渡,将柱做过渡,将 B 柱上柱上的的(n-1)个盘子个盘子(pn zi)移到移到 C 柱柱上。上。第7页/共61页第八页,共61页。第8页/共61页第九页,共61页。#include#include strclass.h”void Hanoi(int n,String A,String B,String C)/解决汉诺塔问题解决汉诺塔问题(wnt)的算法的算法 if(n=1)cout move A to C endl;else Hanoi(n-1,A,C,B);cout move A to C endl;Hanoi(n-1,B,A,C);第9页/共61页第十页,共61页。递归过
9、程递归过程(guchng)与递与递归工作栈归工作栈n n递归过程在实现时,需要自己递归过程在实现时,需要自己调用自己。调用自己。n n层层向下递归,退出时的次序层层向下递归,退出时的次序正好相反正好相反(xingfn):n n 递归调用递归调用n n n!(n-1)!(n-2)!1!0!=1n n 返回次序返回次序n n主程序第一次调用递归过程为主程序第一次调用递归过程为外部调用;外部调用;n n递归过程每次递归调用自己为递归过程每次递归调用自己为内部调用。内部调用。n n它们返回调用它的过程的地址它们返回调用它的过程的地址不同。不同。第10页/共61页第十一页,共61页。递归工作栈递归工作栈
10、n n每一次递归调用时,需要为过每一次递归调用时,需要为过程中使用的参数、局部变量等程中使用的参数、局部变量等另外分配存储空间另外分配存储空间(kngjin)。n n每层递归调用需分配的空间每层递归调用需分配的空间(kngjin)形成递归工作记录,形成递归工作记录,按后进先出的栈组织。按后进先出的栈组织。局部变量局部变量局部变量局部变量返回返回返回返回(fnhu)(fnhu)地址地址地址地址参参参参 数数数数活动活动活动活动记录记录记录记录(jl(jl)框框框框架架架架递归递归工作记录工作记录第11页/共61页第十二页,共61页。函数函数函数函数(hnsh)(hnsh)递归时的活动记递归时的活
11、动记递归时的活动记递归时的活动记录录录录.Function().调用(dioyng)块函数块返回地址返回地址(下一条指令下一条指令)局部变量局部变量 参数参数第12页/共61页第十三页,共61页。long Factorial(long n)int temp;if(n=0)return 1;else temp=n*Factorial(n-1);RetLoc2 return temp;void main()int n;n=Factorial(4);RetLoc1 第13页/共61页第十四页,共61页。计算计算计算计算FactFact时活动记录时活动记录时活动记录时活动记录(jl)(jl)的的的的内
12、容内容内容内容递递递递归归归归调调调调用用用用(d diio oy y n ng g)序序序序列列列列0 RetLoc21 RetLoc22 RetLoc23 RetLoc24 RetLoc1参数参数参数参数(cnsh)(cnsh)(cnsh)(cnsh)返回地址返回地址返回地址返回地址 返回时的指令返回时的指令返回时的指令返回时的指令RetLoc1 return 4*6 /返回返回返回返回2424 RetLoc2 return 3*2 /返回返回返回返回6 6 RetLoc2 return 1 /返回返回返回返回1 1 RetLoc2 return 1*1 /返回返回返回返回1 1 RetL
13、oc2 return 2*1 /返回返回返回返回2 2 第14页/共61页第十五页,共61页。递归过程递归过程(guchng)改为非递归改为非递归过程过程(guchng)n n递归过程简洁、易编、易懂递归过程简洁、易编、易懂递归过程简洁、易编、易懂递归过程简洁、易编、易懂n n递归过程效率低,重复计算多递归过程效率低,重复计算多递归过程效率低,重复计算多递归过程效率低,重复计算多n n改为非递归过程的目的是提高效率改为非递归过程的目的是提高效率改为非递归过程的目的是提高效率改为非递归过程的目的是提高效率n n单向递归和尾递归可直接单向递归和尾递归可直接单向递归和尾递归可直接单向递归和尾递归可直
14、接(zhji)(zhji)用迭代实现其非递归过程用迭代实现其非递归过程用迭代实现其非递归过程用迭代实现其非递归过程n n其他情形必须借助栈实现非递归过其他情形必须借助栈实现非递归过其他情形必须借助栈实现非递归过其他情形必须借助栈实现非递归过程程程程第15页/共61页第十六页,共61页。计算斐波那契数列的函数计算斐波那契数列的函数计算斐波那契数列的函数计算斐波那契数列的函数(hnsh)Fib(n)(hnsh)Fib(n)的定义的定义的定义的定义求解求解求解求解(qi ji)(qi ji)(qi ji)(qi ji)斐波那契数列的递归算法斐波那契数列的递归算法斐波那契数列的递归算法斐波那契数列的递
15、归算法 long Fib(long n)long Fib(long n)long Fib(long n)long Fib(long n)if(n=1)return n;if(n=1)return n;if(n=1)return n;if(n=1)return n;else return Fib(n-1)+Fib(n-2);else return Fib(n-1)+Fib(n-2);else return Fib(n-1)+Fib(n-2);else return Fib(n-1)+Fib(n-2);如如如如 F F0 0=0,F=0,F1 1=1,F=1,F2 2=1,F=1,F3 3=2,F
16、=2,F4 4=3,F=3,F5 5=5 =5 第16页/共61页第十七页,共61页。调用调用调用调用(dioyng)(dioyng)次数次数次数次数 NumCall(k)=NumCall(k)=2*Fib(k+1)-12*Fib(k+1)-1。斐波那契数列斐波那契数列(shli)(shli)的递归调用树的递归调用树Fib(1)Fib(0)Fib(1)Fib(2)Fib(3)Fib(4)Fib(1)Fib(0)Fib(2)Fib(1)Fib(0)Fib(1)Fib(2)Fib(3)Fib(5)第17页/共61页第十八页,共61页。Fib(1)Fib(0)Fib(2)Fib(1)Fib(0)Fi
17、b(2)Fib(1)Fib(3)Fib(4)栈结点栈结点栈结点栈结点(ji din)(ji din)n tagtag=1,向左递归;向左递归;tag=2,向右递归向右递归第18页/共61页第十九页,共61页。Fib(1)Fib(0)Fib(2)Fib(1)Fib(0)Fib(2)Fib(1)Fib(3)Fib(4)2 13 14 1 n=1sum=0+12 23 14 1n=2-23 14 1 n=0sum=1+03 24 1n=3-24 1 n=1sum=1+14 2n=4-2第19页/共61页第二十页,共61页。Fib(1)Fib(0)Fib(2)Fib(1)Fib(0)Fib(2)Fib
18、(1)Fib(3)Fib(4)2 14 2 n=1sum=2+12 24 2n=2-24 2 n=0sum=3+0第20页/共61页第二十一页,共61页。long Fibnacci(long n)Stack S;Node*w;long sum=0;/反反复复执执行行直直到到所所有有终终端端结结点点数据累加完数据累加完 do while(n 1)w-n=n;w-tag=1;S.push(w);n-;/向向左左递递归归到到底底(do d),边边走边进栈走边进栈 sum=sum+n;/执执行行求求和和 第21页/共61页第二十二页,共61页。while(!S.IsEmpty()w=S.getTop(
19、);S.Pop();if(w-tag=1)/改为(i wi)向右递归 w-tag=2;S.push(w);n=w-n 2;/F(n)右侧为F(n-2)break;while(!S.IsEmpty();return sum;第22页/共61页第二十三页,共61页。单向单向(dn xin)递归用递归用迭代法实现迭代法实现long FibIter(long n)if(n=1)return n;long twoback=0,oneback=1,Current;for(int i=2;i=0)cout An=0)cout value An endl;n-;第25页/共61页第二十六页,共61页。递归与回
20、溯递归与回溯(hu s)(hu s)常用于搜索常用于搜索过程过程n皇后问题皇后问题 在在 n 行行 n 列的国际象棋棋盘上,列的国际象棋棋盘上,若两个若两个(lin)皇后位于同一行、皇后位于同一行、同一列、同一对角线上,则称为它同一列、同一对角线上,则称为它们为互相攻击。们为互相攻击。n皇后问题是指找皇后问题是指找到这到这 n 个皇后的互不攻击的布局。个皇后的互不攻击的布局。第26页/共61页第二十七页,共61页。1#主对角线主对角线3#主对角线主对角线5#主对角线主对角线0#次对角线次对角线2#次对角线次对角线4#次对角线次对角线6#次对角线次对角线1#次对角线次对角线3#次对角线次对角线5
21、#次对角线次对角线0#主对角线主对角线2#主对角线主对角线4#主对角线主对角线6#主对角线主对角线0 1 2 3 0123k=i+jk=n+i-j-1第27页/共61页第二十八页,共61页。解题解题(ji t)思路思路n n安放第安放第 i 行皇后时,需要在列行皇后时,需要在列的方向从的方向从 0 到到 n-1 试探试探(j=0,n-1)n n在第在第 j 列安放一个皇后:列安放一个皇后:n n如果在列、主对角线、次对角如果在列、主对角线、次对角线方向有其它皇后,则出现攻线方向有其它皇后,则出现攻击,撤消击,撤消(chxio)在第在第 j 列列安放的皇后。安放的皇后。n n如果没有出现攻击,在
22、第如果没有出现攻击,在第 j 列列安放的皇后不动,递归安放第安放的皇后不动,递归安放第 i+1行皇后。行皇后。第28页/共61页第二十九页,共61页。n n设置设置设置设置 4 4 个数组个数组个数组个数组n n col n col n:coli coli 标识第标识第标识第标识第 i i 列是否安放列是否安放列是否安放列是否安放了皇后了皇后了皇后了皇后(hunghu)(hunghu)n n md2n-1:mdk md2n-1:mdk 标识第标识第标识第标识第 k k 条主对角条主对角条主对角条主对角线是否安放了皇后线是否安放了皇后线是否安放了皇后线是否安放了皇后(hunghu)(hunghu
23、)n n sd2n-1:sdk sd2n-1:sdk 标识第标识第标识第标识第 k k 条次对角线条次对角线条次对角线条次对角线是否安放了皇后是否安放了皇后是否安放了皇后是否安放了皇后(hunghu)(hunghu)n n qn:qi qn:qi 记录第记录第记录第记录第 i i 行皇后行皇后行皇后行皇后(hunghu)(hunghu)在第几列在第几列在第几列在第几列第29页/共61页第三十页,共61页。void Queen(int i)for(int j=0;j n;j+)if(第第 i 行第行第 j 列没有攻击列没有攻击)在第在第 i 行第行第 j 列安放皇后;列安放皇后;if(i=n-1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 05 清华 殷人昆版 学习 教案
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内