收藏 分享(赏)

数据结构—栈与递归--含分治与回溯.ppt

上传人:j35w19 文档编号:12195400 上传时间:2021-11-03 格式:PPT 页数:17 大小:447KB
下载 相关 举报
数据结构—栈与递归--含分治与回溯.ppt_第1页
第1页 / 共17页
数据结构—栈与递归--含分治与回溯.ppt_第2页
第2页 / 共17页
数据结构—栈与递归--含分治与回溯.ppt_第3页
第3页 / 共17页
数据结构—栈与递归--含分治与回溯.ppt_第4页
第4页 / 共17页
数据结构—栈与递归--含分治与回溯.ppt_第5页
第5页 / 共17页
点击查看更多>>
资源描述

1、3.3 栈与递归,什么是递归? 为何用递归? 如何用递归? 递归实现原理-栈,1、什么是递归,main函数 调用函数f ,f 函数 调用函数g ,g 函数 ,f 函数 调用函数f ,递归调用,函数调用,递归指函数直接或间接调用自己,int f ( int n ) int r; if(n= =1) r=1; else r=n*f (n-1); return r; ,void main( ) int x; x=f(5); printf(“%d”,x); ,2 、为何用递归与递归执行过程,很多问题能够用递归的方式描述,此时采用递归算法求解直观容易,如求阶乘:F(1)=1; F(n)=n*F(n-1)

2、,3+ 4 *,3+ 3 *,3+ 2 *,6+ 5 *,3+ 1 1, 6, 2, 1, 24, 120,返址 n r,5 6 7,1 2 3 4,利用递归可方便地解决很多普通方法无法求解的问题,显式递归问题,如求Fibnacci数列 F(n)=F(n-1)+F(n-2)递归公式;F(1)=1,F(2)=1边界条件,int f ( int n ) if(n= =1|n= =2) r=1; /写f(n)=1错 else r=f (n-1)+f (n-2);/注意 return r; ,3、如何用递归,递归求解的关键是找边界条件和递归关系编写递归函数,根据边界条件和递归关系是否明显可将问题分为显

3、示递归和隐式递归两类,前者可直接写出递归函数,后者要通过认真分析找到边界条件,并通过降阶+分治+回溯找递归关系,边界条件,递归公式,隐式递归降阶,Edouard Lucas 1842-1891,French,A,B,C,每次只移一个盘 大盘不能压小盘,类似数学归纳法,假设f(n-1)已知,在此基础上考虑f(n)的求法,如Hannoi塔问题,X,Y,Z,边界条件: if(n= =1) printf(“%c%c”,x,z);,X,Y,Z,降阶:假设能把n-1个盘从一个位置移动到另一个位置则.,hanoi(n, x, y, z); 降阶:分三步 hanoi(n-1, x, z, y); printf

4、(“%c%c”,x,z); hanoi(n-1, y, x, z);,递归函数:,hanoi(int n, char x,char y, char z) 基始条件: if(n= =1) printf(“%c%c”,x,z); 降阶:分三步 hanoi(n-1, x, z, y); printf(“%c%c”,x,z); hanoi(n-1, y, x, z);,x,y,z,A,B,C,void hanoi(int n, char x, char y, char z) if(n= =1) printf(“%c%cn”,x,z); else hanoi(n-1, x, z, y); printf(

5、“%c%cn”,x,z); hanoi(n-1, y, x, z); void main( ) hanoi(3,A,B,C); ,A C A B C B A C B A B C A C,递归函数中要有使递归趋于结束的边界条件 对于Fibnacci数列中F(n)=F(n-1)+F(n-2)形式的递归公式,分析求f(5)的过程可知f(1)被多次重复调用,因此原因,求F(40)在Core2 T5500CPU上约费20秒时间,故此类问题要避免递归,需用非递归算法改写递归参考书 参考”关于递归教学的探讨.doc”,注意事项:,隐式递归分治,-树的相关操作,int TreeDepth(Tree T)/求二

6、叉树深 if(T=NULL)d=0; else d1=TreeDepth(T-lchild1); d2=TreeDepth(T-rchild); if(d1d2) d=d1+1; else d=d2+1; return d; ,一棵树由根结点、左子树及右子树组成,对树的操作可分成对根、左子树和右子树的操作来完成!,隐式递归回溯,-8皇后问题,终态易判定,递归过程记录完整解,回溯输出.Go-Verify,int Go(int arrNN,int i) /逐行处理,当前处理编号为i的行 int j; for (j = 0; jN; +j) arrij = 1;/尝试在第i行的第j列摆下一个棋子;

7、int successFlag=Verify(arr,i); if (successFlag=0) arrij=0; continue; else if(successFlag=1,void PrintChessBoard(int aNN) int i,j; for(i=0;i1)return 0; return 1; ,隐式递归回溯(全部解),void Go(int arrNN,int i) /逐行处理,当前处理编号为i的行 for (int j = 0; j1) /递归前进,入栈 e.n=n; Push(S,e); n-; e.n=1;e.r=1;Push(S,e); /边界条件 while(!StackEmpty(S) /递归后退,出栈 Pop(S,e); if(!StackEmpty(S) /计算下层r GetTop(S,temp); temp.r=temp.n*e.r; SetTopElem(S,temp); /递归结束 return e.r;/返回结果 /更多可参考相关论文,算法演示系统 作业1:3.15 作业2:N-皇后问题求唯一解,只写Go函数即可,注意事项:,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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