- 1、本文档共46页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归算法(Recursion) 本章内容 递归算法定义 递归算法举例 递归算法复杂性的计算 递归(Recursion)定义 直接或间接地调用自身的算法称为递归算法 直接或间接调用自身的函数称为递归函数 尾递归是指递归调用的语句在递归函数的最后一句 递归算法的特点: 用于解决一类递归定义的问题 算法易于实现,简单明了 函数的递归调用 1. 定义: 在调用一个函数的过程中直接或间接地调用该函数本身。 直接调用 int f(x) int x; { int y,z; ….. z=f(x); …… return (2*z); } 间接调用 int f1(x) int x; { int y,z; ….. z=f2( y); …… return (2*z); } int f2(t) int t; { int a,c; ….. c=f1(a); …… return (3+c); } 特点 是无终止的递归调用,因此,应该给定一个限制递归次数的条件。 使用递归的准则 如果待解决的问题具备下列两个特性,就可以考虑使用递归。1)复杂的问题可以转换为简单些的1个或几个子问题;2)最简单的问题可以直接解决 例1.3斐波那契(Fibonacci)序列: F0= F1 = 1 Fi = Fi-1 + Fi-2 (i1) 算法 求斐波那契数 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)存在大量的重复计算 ,可以改进算法:保存中间结果 例1.4 欧几里得算法 已知两个非负整数a和b,且a>b≥0,求这两个数的最大公因数。 辗转相除法:若b=0,则a和b的最大公因数等于a;若b>0,则a和b的最大公因数等于b和用b除a的余数的最大公因数。 算法1.8 求最大公因数 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; 例1.5 递归在非数值算法设计中的应用 已知元素x,判断x是否在A(1:n)中。 算法 在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 子程序的调用形式 2.递归算法设计 定义递归(数学公式,数列等的定义。) 数据结构递归(单链表,树,二叉树) 可用递归解决的问题P(hanoi问题) 问题P具有大规模 不同规模的问题P,具有相同性质;并且大规模的问题由小规模的问题构成 小规模的问题是可解的 关键: 找到递归的递推关系 找到结束递归的条件 递归求解的伪代码 简单的0/1背包问题 棋子移动 N=4,(4,5)---(9,10) n=6, (6,7)---(13,14) (8,9)---(4,5) (11,12)---(6,7) (2,3)---(8,9) n=5 (7,8)---(2,3) (1,2)-
文档评论(0)