第5章递归讲述.ppt

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第5章递归讲述

Hanoi问题 n阶Hanoi塔问题:假设有三个分别命名为X、Y、Z的塔座,在X塔座上插有n个直径大小各不相同,依小到大编号为1,2,…,n的圆盘,要求:把X上的n个圆盘移到Z上,排列顺序相同,移动规则为: 每次只能移动一个圆盘; 圆盘可以在任一塔上做多次移动; 在任何时刻,大盘不能压小盘; Hanoi问题 void Hanoi( int n, char x, char y, char z ) { if( n == 1 ) Move( 1, x, z ); // 把1号盘,从x移到z else { Hanoi( n – 1, x, z, y );// 把n-1个盘,从x移到y,z为辅助塔 Move( n, x, z ); // 把n号盘,从x移到z Hanoi( n – 1, y, x, z );//把n-1个盘,从y移到z,x为辅助塔 } } 递归求n! 递归调用的实现原理 返回时,执行出栈操作,把当前栈顶保留的值送回相应的参数中进行恢复,并按栈顶中的返回地址,从断点处继续执行。 例5.2 利用串的基本运算写出对串求逆的递归算法。 递归模型: s s为空串 f(s)= Concat(f(SubStr(s,2,StrLength(s)-1)),SubStr(s,1,1)) 其他 SqString invert(SqString s) { SqString s1,s2; if(StrLength(s)0) { s1=invert(SubStr(s,2,StrLength(s)-1)); s2=Concat(s1,SubStr(s,1,1)); } else StrCopy(s2,s); return s2; } 例5.3 求顺序表{a1,a2,…,an}中的最大元素。 解:将线性表分解成{a1,a2,…,am}和{am+1,…,an}两个子表,分别求得子表中的最大元素ai和aj,比较ai和aj中的大者,就可以求得整个线性表的最大元素。 而求解子表中的最大元素方法与总表相同,即再分别将它们分成两个更小的子表,如此不断分解,直到表中只有一个元素为止。 ElemType Max(SqList L,int i,int j) { int mid; ElemType max,max1,max2; if(i==j) max=L.data[i]; else { mid=(i+j)/2; max1=Max(L,i,mid); max2=Max(L,mid+1,j); max=(max1max2)?max1:max2; } return(max); } * * 第5章 递归 5.3 递归算法的设计 5.1 什么是递归 5.2 递归调用的实现原理 5.1.1 递归的定义 递归:在定义一个过程或函数时出现调用本过程或本函数的成分。 直接递归:调用自身。 间接递归:若函数p调用函数q,而q又调用p。 尾递归:一个递归函数中递归调用语句是最后一条执行语句。 5.1 什么是递归 例5.1 以下是求n!(n为正整数)的递归函数。 int fun(int n) { if (n==1) /*语句1*/ return 1; /*语句2*/ else /*语句3*/ return fun(n-1)*n; /*语句4*/ } 递归可以把一个大型复杂的问题转化为一个或多个与原问题相似的规模较小的问题来求解,通过少量的语句,实现重复计算。 体现了分而治之的算法思想 在以下3种情况下,常常要用到递归的方法。 1. 定义是递归的 2. 数据结构是递归的 例如,单链表就是一种递归的数据结构,其结点类型定义如下: typedef struct LNode { ElemType data; struct LNode *next; } LinkList; 该定义中,结构体LNode的定义中用到了它自身,即指针域next是一种指向自身类型的指针。 5.1.2 何时使用递归 求n!和Fibonacci数列 【举例】求一个不带头结点的单链表L的所有data域(假设为int型)之和。 int Sum(LinkList *L) { if (L==NULL) return 0; else return(L-

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档