递归和迭代对程序影响.docVIP

  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 递归和迭代概述      如果一个问题刚开始难以解决,可以将其简化后再尝试解决。如果这个过程可以重复进行,问题最终会变得容易处理。由此引出两种不同的方法:递归和迭代。循环或迭代,是一种重复执行一个过程的方法;递归是另一种方法。递归函数是通过调用函数自身来完成任务,而且在每次调用自身时减少任务量。而迭代是循环的一种形式,这种循环不是由用户输入而控制,每次迭代步骤都必须将剩余的任务减少;也就是说,循环的每一步都必须执行一个有限的过程,并留下较少的步骤。循环的进度通常用一个在每次迭代时都进行自增或自减的变量的值来衡量,直到到达预定的目标为止。用递归算法表示许多问题的求解方法时算法思想非常简洁。但是递归算法不仅时间效率非常差,而且由于递归算法是不断的函数调用和函数返回过程,因此其实际的计算机运行时间通常远大于循环方式算法的计算机运行时间,甚至在有限的时间内无法求解。这就存在一个把递归算法化为非递归算法的问题。      2 需要用迭代消解递归的情况      递归算法特别适合于所研究的问题或所处理的数据本身是递归定义的情况。然而,并不意味着这种递归定义保证递归算法是解决该问题的最好方法。事实上,主要是因为拿那种不合适的例子来解释递归算法概念,从而造成了对程序设计中使用递归的普遍怀疑和否定态度,并把递归同低效等同起来。而且在递归算法中,往往会因???追求代码短或者在求解问题时一味追求规律性,多用了无用的压栈和出栈的操作。比如用循环消解的尾递归,是多了无用的压栈和出栈才使速度受损的;斐波那契数列计算的递归改循环迭代所带来的速度大幅提升,是因为改掉了重复计算的毛病。假使一个递归过程中本身包含了大量冗余的操作,并且这个过程又可以用迭代来达到相同的效果。这时,我们就一般用迭代来消解递归。也就是说尾递归算法和单向递归算法可用迭代算法来代替。可以用一个方案来描述人们力图在其中避免使用算法递归的程序,这个方案展示了其构成的模型。(1)式或等价的(2)式就是这个方案:   P≡ if B then (S;P)(1)   P≡(S; if B then P)(2)   要计算用简单递归关系定义的值时,这种方案是很自然的。如下例:   Function F (I: integer ):integer;   Begin if I0 then F:=I*F(I-1)   Else F:=1;   End(3)   很明显,在这种情况下,递归可由简单迭代代替,即由下面的程序代替。   I:=0;F:=1;   While In do   Begin I:=I+1;F:=I*F   End (4)   一般地,对应于方案(1)或(2)的程序应按照下列方案改写:   P ≡(x:=x0;while B do S)    还有更复杂的递归构造方案,这些方案可以并且应该改写成迭代计算的形式。一个例子就是Fibonacci 数的计算,这些数是按递归关系定义的:    FIBn+1=FIBn+FIBn-1对n0    而FIB1=1,FIB0=0,一个直接的自然的解法导致程序    function fib (n: integer): integer;    begin if n=0 then fib :=0else    if n=1 then fib :=1 else    fib:=fib(n-1)+fib(n-2)    end   以调用fib(n)来计算FIBn ,就引起这个函数过程的递归活动。频繁程度如何呢?我们注意到,对于n1,每调用一次引起两个新的调。因此,调用的总次数按指数增长,如下图所示fib(5)的递归树。这样一个程序显然是不实用的。   但显见,利用辅助变量x=FIBi与y=FIBi-1,就可以用迭代方案来计算Fibonicca 数,而避免同一值的重复计算。    { 对n0计算x=FIBn}   i:=1;x:=1;y:=0;   while in do   begi

文档评论(0)

130****9768 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档