第6章 递归和广义表.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第6章 递归和广义表

本章内容 递归 广义表(略) 什么是递归? 从前有座山山上有座庙的故事…… 一个事件或对象,部分的由自己组成,或者用它自己来定义,则称这个对象是递归的。 例如,用递归来定义偶数: (1)一个偶数加上2还是偶数; (2)0是偶数。 递归函数 又称为自调用函数,即自己调用自己的函数,函数直接或间接调用自己的算法称为递归算法。 分类: 直接递归:函数直接调用本身。 A( ) { …… CALL A( ) ...... } 间接递归:函数在调用其他函数时,产生了对自身的调用。 A( ) B( ) { …… { …… CALL B( ) CALL A( ) …… } …… } 递归函数 例:以下是求n!(n为正整数)的递归函数。 int fun(int n) { int x; if (n == 1) /*递归出口*/ x = 1; else x = fun(n-1) * n; /*递归体*/ return(x); } 在该函数fun(n)求解过程中,直接调用fun(n-1)自身,所以它是一个直接递归函数。 递归算法 递归算法包括两部分: 递推(递归体):为得到问题的解,将其推导到比原来问题更为简单的问题求解上。 回归(递归出口):简单问题得到解后,回归到原问题的解上。 递归算法的思路: 把一个不能或不好直接求解的“大问题”转化成一个或几个“小问题”来解决,再把这些“小问题”进一步分解成更小的“小问题”来解决,如此分解,直至每个“小问题”都可以直接解决(即分解到递归出口)。 但递归分解不是随意的分解,递归分解要保证“大问题”与“小问题”相似,即求解过程与环境都相似。 递归算法 采用递归算法需具备的条件: 要解决的问题可以转化成另一个问题,解决新问题的方法与原始问题的解决方法相同。 必须具备终止递归的条件。 何时使用递归? 在以下三种情况下,常常要用到递归的方法。 定义是递归的 数据结构是递归的 问题的求解方法是递归的 定义是递归的 有许多数学公式、数列等的定义是递归的。例如,求n!和Fibonacci数列等。这些问题的求解过程可以将其递归定义直接转化为对应的递归算法。 int Fib(int n) { int x; if(n==1 || n==2) x = 1; /*递归出口*/ else x = Fib(n-1) + Fib(n-2); /*递归体*/ return x; } 数据结构是递归的 有些数据结构是递归的。例如,第2章中介绍过的单链表就是一种递归数据结构,其结点类型定义如下: typedef struct LNode { ElemType data; /* 数据域 */ struct LNode *next; /* 指针域 */ }LinkList; 该定义中,结构体LNode的定义中用到了它自身,即指针域next是一种指向自身类型的指针,所以它是一种递归数据结构。 数据结构是递归的 对于递归数据结构,采用递归的方法编写算法既方便又有效。 例如,求一个不带头结点的单链表head的所有data域(假设为int型)之和的递归算法如下: int Sum(LinkList *head) { if (head==NULL) /*递归出口*/ return 0; else /*递归体*/ return (head-data + Sum(head-next)); } 问题的求解方法是递归的 有些问题的求解方法是递归的 例如 汉诺塔(Hanoi)问题 八皇后问题 汉诺塔问题 问题描述:有三个命名为A、B、C的塔座,在塔座A上插有n个直径各不相同的,从小到大依次编号为1,2,3,……,n的圆盘,编号越大的圆盘其直径越大;要求将A轴上的n个圆盘全部移至塔座C上并仍按同样顺序叠放,并且圆盘移动时必须遵循下列规则: 每次只能移动一个圆盘。 圆盘可以插入A、B、C中任一个塔座上。 任何时候都不能将一

文档评论(0)

xiaolan118 + 关注
实名认证
文档贡献者

你好,我好,大家好!

版权声明书
用户编号:7140162041000002

1亿VIP精品文档

相关文档