递归过程与递归工作栈(ppt 62页).ppt_第1页
递归过程与递归工作栈(ppt 62页).ppt_第2页
递归过程与递归工作栈(ppt 62页).ppt_第3页
递归过程与递归工作栈(ppt 62页).ppt_第4页
递归过程与递归工作栈(ppt 62页).ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

递归的概念递归过程与递归工作栈递归与回溯广义表,第五章递归与广义表,递归的概念,递归的定义若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的;若一个过程直接地或间接地调用自己,则称这个过程是递归的过程。以下三种情况常常用到递归方法。定义是递归的数据结构是递归的问题的解法是递归的,定义是递归的,求解阶乘函数的递归算法longFactorial(longn)if(n=0)return1;elsereturnn*Factorial(n-1);,例如,阶乘函数,求解阶乘n!的过程,主程序main:fact(4),参数4计算4*fact(3)返回24,参数3计算3*fact(2)返回6,参数2计算2*fact(1)返回2,参数1计算1*fact(0)返回1,参数0直接定值=1返回1,参数传递,结果返回,递归调用,回归求值,数据结构是递归的,一个结点,它的指针域为NULL,是一个单链表;一个结点,它的指针域指向单链表,仍是一个单链表。,例如,单链表结构,f,f,搜索链表最后一个结点并打印其数值templatevoidPrint(ListNode*f)if(f-link=NULL)coutdatalink);,f,f,f,f,f,a0,a1,a2,a3,a4,递归找链尾,在链表中寻找等于给定值的结点并打印其数值templatevoidPrint(ListNode*f,Type,f,f,f,f,递归找含x值的结点,x,问题的解法是递归的例如,汉诺塔(TowerofHanoi)问题的解法:如果n=1,则将这一个盘子直接从A柱移到C柱上。否则,执行以下三步:用C柱做过渡,将A柱上的(n-1)个盘子移到B柱上:将A柱上最后一个盘子直接移到C柱上;用A柱做过渡,将B柱上的(n-1)个盘子移到C柱上。,#include#includestrclass.h”voidHanoi(intn,StringA,StringB,StringC)/解决汉诺塔问题的算法if(n=1)coutmoveAtoCendl;elseHanoi(n-1,A,C,B);coutmoveAtoCn=n;w-tag=1;S.push(w);n-;/向左递归到底,边走边进栈sum=sum+n;/执行求和,while(!S.IsEmpty()w=S.getTop();S.Pop();if(w-tag=1)/改为向右递归w-tag=2;S.push(w);n=w-n2;/F(n)右侧为F(n-2)break;while(!S.IsEmpty();returnsum;,单向递归用迭代法实现,longFibIter(longn)if(n=1)returnn;longtwoback=0,oneback=1,Current;for(inti=2;i=0)coutAn=0)coutvalueAnendl;n-;,递归与回溯常用于搜索过程,n皇后问题在n行n列的国际象棋棋盘上,若两个皇后位于同一行、同一列、同一对角线上,则称为它们为互相攻击。n皇后问题是指找到这n个皇后的互不攻击的布局。,1#主对角线3#主对角线5#主对角线,0#次对角线2#次对角线4#次对角线6#次对角线,1#次对角线3#次对角线5#次对角线,0#主对角线2#主对角线4#主对角线6#主对角线,0123,0123,k=i+j,k=n+i-j-1,解题思路,安放第i行皇后时,需要在列的方向从0到n-1试探(j=0,n-1)在第j列安放一个皇后:如果在列、主对角线、次对角线方向有其它皇后,则出现攻击,撤消在第j列安放的皇后。如果没有出现攻击,在第j列安放的皇后不动,递归安放第i+1行皇后。,设置4个数组coln:coli标识第i列是否安放了皇后md2n-1:mdk标识第k条主对角线是否安放了皇后sd2n-1:sdk标识第k条次对角线是否安放了皇后qn:qi记录第i行皇后在第几列,voidQueen(inti)for(intj=0;jn;j+)if(第i行第j列没有攻击)在第i行第j列安放皇后;if(i=n-1)输出一个布局;elseQueen(i+1);撤消第i行第j列的皇后;,算法求精voidQueen(inti)for(intj=0;jn;j+)if(!colj/*在第i行第j列安放皇后*/,if(i=n-1)/*输出一个布局*/for(j=0;jn;j+)coutqj,;couttlink=NULL)returnNULL;elsereturnfirst-tlink;GenListNode*GenList:Next(GenListNode*elem)if(elem-tlink=NULL)returnNULL;elsereturnelem-tlink;,广义表的递归算法,广义表的复制算法voidGenList:Copy(constGenList,switch(ls-utype)case0:q-value.ref=ls-value.ref;break;case1:grinfo=grinfo;break;case2:q-value.charinfo=ls-value.charinfo;break;case3:q-value.hlink=Copy(ls-value.hlink);,q-tlink=Copy(ls-tlink);returnq;,求广义表的深度,例如,对于广义表E(B(a,b),D(B(a,b),C(u,(x,y,z),A(),1,1,1,1,2,3,4,intGenList:depth(GenListNode*ls)if(ls-tlink=NULL)return1;/空表GenListNode*temp=ls-tlink;intm=0;while(temp!=NULL)/在表顶层横扫if(temp-utype=3)/结点为表结点intn=depth(temp-value.hlink);if(mtlink;returnm+1;,intGenList:depth()returndepth(first);,广义表的删除算法,01,15,3,3,12,01,2x,01,01,2y,ls,3,2x,扫描子链表若结点数据为x,删除。可能做循环连续删。若结点数据不为x,不执行删除。若结点为子表,递归在子表执行删除。,扫描子链表若结点数据为x,删除。可能做循环连续删。若结点数据不为x,不执行删除。若结点为子表,递归在子表执行删除。,voiddelvalue(GenListNode*ls,constvaluex)/在广义表中删除所有含x的结点if(ls-tlink!=NULL)/非空表GenListNode*p=ls-tlink;,wh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论