- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章 递归算法 1. 递归 直接或间接地调用自身 递归是一种强有力的设计方法 递归的效率问题 2. 使用递归的准则 如果待解决的问题具备下列两个特性,就可以考虑使用递归。1)复杂的问题可以转换为简单些的1个或几个子问题;2)最简单的问题可以直接解决 例:兔子的问题 假设小兔子一个月长成大兔子,大兔子每一个月生一个小兔子,第一个月有一只小兔子,不考虑兔子的寿命,求n个月后有多少只兔子? 例3.1 斐波那契(Fibonacci)序列: F0= F1 = 1 Fi = Fi-1 + Fi-2 (i1) 算法3.1 求斐波那契数 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-1) 、F(n-2)存在大量的重复计算 改 进:保存中间结果 改进的算法 procedure F1(n) //返回第n个斐波那契数// integer n if n 2 then return(1) else return(F2(2,n,1,1)) endif end F1 procedure F2(i,n,x,y) if i≤ n then call F2(i+1,n,y,x+y) endif return(y) end F2 例3.2 欧几里得算法 已知两个非负整数a和b,且a>b≥0,求这两个数的最大公因数。 辗转相除法:若b=0,则a和b的最大公因数等于a;若b>0,则a和b的最大公因数等于b和用b除a的余数的最大公因数。 算法3.2 求最大公因数 procedure GCD(a,b) // 约定ab // if b=0 then return(a) else return (GCD(b,a mod b)) endif end GCD 例: GCD(22,8) = GCD(8,6) = GCD(6,2) = GCD(2,0) = 2; 例3.3 递归在非数值算法设计中的应用 已知元素x,判断x是否在A(1:n)中。 算法3.3 在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. 消去递归 直接递归的消去规则: 基本思路:将递归过程中出现递归调用的地方,用等价的非递归代码来代替,并对return语句做适当处理。 13条规则:处理直接递归调用中的递归代码和return语句,将之转换成等价的迭代代码。 初始化 ⑴ 在过程的开始部分,插入说明为栈的代码并将其初始化为空。在一般情况下,这个栈用来存放参数、局部变量和函数的值、每次递归调用的返回地址。 ⑵ 将标号L1附于第一条可执行语句。然后对于每一处递归调用都用一组执行下列规则的指令来代替。 处理递归调用语句 ⑶ 将所有参数和局部变量的值存入栈。 栈顶指针可作为一个全程变量来看待。 ⑷ 建立第i个新标号Li,并将i存入栈。这个标号的i值将用来计算返回地址。 此标号放在规则⑺所描述的程序段中。 ⑸ 计算这次调用的各实在参数(可能是表达式)的值,并把这些值赋给相应的形式参数。 ⑹ 插入一条无条件转向语句转向过程的开始部分: Goto L1 对递归嵌套调用的处理 ⑺ 如果这过程是函数,则对递归过程中含有此次函数调用的那条语句做如下处理:将
文档评论(0)