一种将递归过程转换为非递归过程方法研究.docVIP

一种将递归过程转换为非递归过程方法研究.doc

  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文档。上传文档
查看更多
一种将递归过程转换为非递归过程方法研究

一种将递归过程转换为非递归过程的方法研究   摘 要:提出一种把递归过程转换为非递归过程的方法――递归树法,画出递归过程的递归树,然后通过对递归树的后根序遍历实现递归过程的非递归化,最后通过案例说明该方法的可行性和有效性。   关键词:递归;递归过程;非递归化;递归树   0 引 言   递归有思路清晰、代码简洁、易于理解等特点,是很多算法设计策略(如分治、回溯等)的核心内容,但是递归过程在计算机中实现时需要多次调用自身,增加了时空开销。很多学者对递归过程进行了深入研究[1-4],部分学者提出了一些递归过程的非递归化方法[4]。文献[3]和[5]虽然能很好地描述递归过程,但没有给出如何转换为非递归过程的一般方法;文献[4]提出了模仿法,该方法从简单实例入手,逐步过渡到较复杂的递归算法,初学者容易理解,但不能对复杂的递归过程进行直观分析。   由于递归树[2-3]作为研究递归过程的一种图形化方法,具有直观、简单等特点。笔者在此基础上提出一种基于递归树的递归过程的非递归化方法,该方法通过对递归树后根序遍历的思想实现递归过程的非递归化,具有直观、易于理解的特点。   1 递归与递归树   1.1 递归及递归过程的设计   一个问题的解法可以通过把该问题划分成若干子问题,若子问题比较简单,则直接求解;否则,采用与原问题相同的方法对这些子问题进行再划分、求解,依次类推,直到子问题变得较为简单,可以直接求解,当求出所有子问题的解后再对其进行汇总即可得到原问题的解,则称该问题为递归问题[5]。在计算机上,人们通常采用递归方法来求解递归问题,设计出的算法称为递归算法。   在递归方法中,递推动作和结束条件是两个重要组成部分。结束条件是指子问题比较简单、不必再划分成若干更小的子问题时应满足的条件,也就是说,当子问题满足结束条件时可以直接求解。当子问题不满足结束条件,还需要划分成更简单的子问题时需要执行的操作步骤称为递推动作。递推动作必须使递归算法能够逐步到达结束条件。递归算法的一般模型为:   algorithm () {   if () /* 递归的结束条件 */   return (direct value); /* 直接求解,并返回结果 */   else /* 递归 */   return ((parameter exchange)); /* 递推动作 */   }   递归的整个过程可分为两个子过程:递推过程和回归过程。当不满足结束条件时,递归过程需要不断执行递推动作的过程为递推过程;当满足结束条件时停止递推动作并沿递推过程的逆过程进行回溯的过程为回归过程。递推过程是对子问题不断细化使其逐步向结束条件靠近的过程;回归过程是返回各子问题的结果并汇总直到得出问题最终解的过程。在一些复杂的递归算法中,递推过程和回归过程是交替出现的。   1.2 递归树及其构建   在计算机中,递归调用由若干个子递归调用组成,而子递归又有更下一层的子递归调用,这种逐层调用的轨迹可以用递归树来刻画。   递归树是一种有序树,树根为递归算法的入口,根的值为递归参数值,如果递归参数值满足结束条件,则开始回归过程,此时根结点也是叶子结点;否则,递归算法需要调用自身若干次,每调用一次就相当于?涓?多了一个分支,即产成一棵子树;每棵子树也是递归树。   递归树是研究递归问题与递归算法之间的一座桥梁。在分析具体问题时,我们首先从根结点出发,按照递归的递推过程不断建立并扩展递归树,当满足结束条件时,该递归树的根结点就成了叶子结点,然后根据建树的逆序过程,不断向根部返回并得到最终解。   与一般的非递归算法的分析方法――“单步跟踪法”不同,递归树可以直观、清晰地描述递归算法的整个过程。对于一般的非递归算法,设计者常用单步跟踪法动态演示算法的执行过程;但在递归算法中,由于不同层次递归时的参数是不一样的,对于层数较多、递推过程和回归过程交替出现的递归算法,“单步跟踪”法容易导致设计者对当前调用环境中的参数产生混乱,因此,递归树法可以有效避免“单步跟踪”法的缺点。   2 案例分析   正确设计一个递归算法的前提是分析问题、明确具体任务并给出清晰的递归定义。接下来,笔者通过两个案例来说明递归树在研究递归算法并把递归算法转换为相应的非递归算法中的作用。以下算法均采用类C++程序设计语言进行定义和描述。   2.1 汉诺塔(Tower of Hanoi)问题   用状态变量(n, A, B, C)表示“把 n 个盘子从A柱,借助于B柱移动到C柱上”。参数n表示当前的盘子数量;参数A、B和C分别为柱子的编号。汉诺塔问题的递归解法为:   void Hanoi_R(n, A, B, C) {   if (n == 1)   move

文档评论(0)

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

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

1亿VIP精品文档

相关文档