- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构6递归
* 复习 一、常见特殊矩阵的存储规律: 对称矩阵、上(下)三角矩阵、对角矩阵、三对角矩阵 二、稀疏矩阵的处理 存储结构: - 非零元的表示:三元信息组(r,c,d) - 行逻辑连接的顺序表表示 - 十字链表 应用:矩阵的转置(两种算法)、矩阵相乘、一元或多元多项式运算 第六章 递 归 递归是解决计算机和数学问题的一个有效工具,同时也是一种化繁为简的思维方式。在程序设计语言中可以用它来定义语言的语法,在数据结构中可以用它来编制表和树结构的查找和排序算法。递归也应用在组合数学领域用来处理计数和可能性问题。无论在理论还是在实际应用方面,递归都是算法研究、博弈论和图论的重要课题。 在软件设计中递归是一个重要的算法设计方法和技术,递归子程序是通过调用自身来完成与自身要求相同的子问题的求解,并利用系统内部功能自动实现调用过程中信息的保存与恢复,因而省略了程序设计中的许多细节操作,简化了程序设计过程,使程序设计人员可以集中注意力于主要问题的求解上。 6.1 什么是递归 6.1.1 递归的定义 在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。 递归就是一个事件或对象部分由自己组成,或者按它自己定义。 一般程序调用: 主程序 ┇ 调用子程序A ┇ return 子程序A ┇ 调用子程序B ┇ return 子程序B ┇ ┇ ┇ return 递归程序调用: 程序proc ┇ ┇ 调用程序proc ┇ return 递归程序也必须有出口,其过程比较繁琐。递归问题举例: 例6.1 定义一个人的后代概念如下: ⑴ 这个人的子女是它的后代; ⑵ 这个人的子女的后代也是他的后代。 即定义后代概念时有使用了这个概念。 一、递归算法的组成 函数或过程直接或间接调用自己的算法称为递归算法。递归算法包括: ⑴ 递推:就是为得到问题的解,将其推倒比原来问题简单的问题的求解。使用递推时应注意到,递推应有终止之时。 如求n!: 阶乘 Fact(n) = 1, n=0 n * Fact(n-1), n0 这里的 n=0,即 0!=1为递推的终止条件。 ⑵ 回归:就是指当“简单问题得到解后,回归到原问题的解上”。 如在求n!时,当计算完(n-1)!后,回归到计算n(n-1)上。但是在使用回归时应注意,递归算法所涉及的参数与局部变量是有层次的。 回归并不引起其他动作。 二、递归方法分类 递归过程又称为自调用过程。递归过程是利用栈的技术来实现的。只不过这个过程是系统自动完成的。常见的递归方法有: ⑴ 直接递归:就是函数或过程直接调用本身。如(a)所示。 A() { ┇ call A() ┇ } 图(a) ⑵ 间接递归:一个函数或过程如果在调用其他函数或过程时,又产生了对自身的调用。如(b)图所示。 A() { ┇ call B() ┇ } B() { ┇ call A() ┇ } 图(b) ⑶ 尾递归:在一个递归过程或递归函数中递归调用语句是最后一条执行语句。 例6.2 以下是求 n!(n为正整数)的递归函数。 int fun(int n) { int x; if (n==1) /*语句1*/ x=1; /*语句2*/ else /*语句3*/ x=fun(n-1)*n; /*语句4*/ return(x); /*语句5*/ } 在该函数fun(n)求解过程中,直接调用fun(n-1)(语句4)自身,所以它是一个直接递归函数。又由于递归调用是最后一条执行语句,所以它又属于尾递归。 6.1.2 递归调用的实现原理 - 栈与递归的实现(教材的6.2) 一、函数调用时的现场处理原则 1. 每调用一个函数,要将当前“现场信息”即当前参数、返回地址等压入栈顶, 2. 每当从一个函数退出时要将栈顶保存的最近一次的函数调用信息弹出即“恢复现场”, 3. 返回调用函数时,当前存储区保存的是调用时的现场内容。 二、现场处理的基本方法 1. 系统建立一个“递归工作栈”,作为整个递归函数运行期间使用的数据存储区; 2. 每进行一次调用便生成一个“工作记录”,其内容如下: 所有需要传递的参数、所有局部变量、返回地址 并压入栈顶; 3. 退出一次递归时从栈顶弹出一个工作记录,按栈顶元素记录的返回地址继续执行;即利用栈实现现场保护与现场恢复。 如
文档评论(0)