_递归算法.ppt

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

第3章 递归算法 递归算法概述 递归是一种强有力的设计方法 递归算法的特点 简单明了易于证明 递归的效率问题 3.1.2 递归过程的内部实现原理   递归调用过程被看作是嵌套调用自身的过程,其调用和返回的原理与子程序的调用和返回相同。需要注意的是在递归调用自身时,并不是将自身代码进行复制,然后执行复制代码,而是采用代码共享的方式,即程序控制跳转到同一段代码执行,不同的是当前堆栈中对应的形参和局部变量的数据不同。 例1.3 斐波那契(Fibonacci)序列: F0 = F1 = 1 Fi = Fi-1 + Fi-2 (i1) 算法1.7 求斐波那契数列 procedure F(n) //返回第n个斐波那契数// integer n if n= 1 then return(1) else return(F(n-1) + F(n-2)) endif end F 算法效率:对F(n-2) 、F(n-3)、…存在大量的重复计算 改 进:保存中间结果 例1.5 用递归策略设计的检索算法 已知元素x和元素表A(1:n),判断x是否等于A中 某元素的值。 算法1.9 在A(1:n)中检索x procedure SEARCH(i) //如果在A(1:n)中有一元素A(k)=x,则将其第一次出现的下标k返回,否则返回0// global n,x,A(1:n) case :in: return(0) :A(i) = x; return(i) :else: return(SEARCH(i+1)) endcase end SEARCH 3.2 递归转非递归 直接递归的消去规则: 基本思路:将递归调用的地方用等价的非递归代码来代替,并对return语句做适当处理。 13条规则:处理直接递归调用和return语句,将之转换成等价的迭代代码。 初始化 ⑴ 在过程的开始部分,插入说明为栈的代码并将其初始化为空: StackType Stack[1..SIZE] Top ← 0 在一般情况下,这个栈用来存放参数、局部变量和函数的值、每次递归调用的返回地址。 ⑵ 将标号L1附于第一条可执行语句。 ... L1:第一条可执行语句 ... 然后对于每一处递归调用都用一组执行下列规则的指令来代替。 处理递归调用语句 ⑶ 将所有参数和局部变量的值存入栈。 Top ← Top +1 Stack[Top] ← … 栈顶指针可作为一个全程变量来看待。 ⑷ 建立第i个新标号Li,并将标号的下标i存入栈。这个标号的i值将用来计算返回地址。 Top ← Top +1 Stack[Top] ← i 此标号放在规则⑺所描述的程序段中。 ⑸ 计算这次调用的各实在参数(可能是表达式)的值,并把这些值赋给相应的形式参数。 ⑹ 插入一条无条件转向语句转向过程的开始部分: goto L1 (以上完成一次递归调用) 对退出点的处理 ⑺ 如果这过程是函数,则对递归过程中含有此次函数调用 的那条语句做如下处理:将该语句的此次函数调用部分用从栈顶 取回该函数值的代码来代替,其余部分的代码按原描述方式照抄,并将⑷中建立的标号附于这条语句上。 如果此过程不是函数,则将⑷中建立的标号附于⑹所产生的转移语句后面的那条语句。 以上步骤消去过程中的递归调用。 下面对过程中出现return语句进行处理。 注:纯过程结束处的end可看成是一条没有值与之联系的return语句 对每个有return语句的地方,执行下述规则: ⑻ 如果栈为空,则执行正常返回。 if top = 0 then return(…) ⑼ 否则,将所有输出参数(带有返回值的出口参数,out/ inout型)的当前值赋给栈顶上的那些对应的变量。 Stack[n] ← … ⑽ 如果栈中有返回地址标号的下标,就插入一条此下标从栈中退出的代码,并把这个下标赋给一个未使用的变量。 addr ← Stack[Top] Top ← Top -1 ⑾

文档评论(0)

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

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

1亿VIP精品文档

相关文档