- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第二十七讲递程序设计之递归
程序设计之递归(2) 第二十七讲 试用递归的方法完成下列问题 (2).有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子? 分析:我们先模拟出前十个月的兔子对数1 1 2 3 5 8 13 … 我们的出结论:第N天的兔子数等于N-1天的兔子数目+(n-2)天的老兔子繁殖的小兔子,即递推公式等于: A[N]=A[N-1]+A[N-2] N=3; A[N]=1;(N=1) A[N]=1;(N=2) 参考程序 Program ck(input,output); Var Day:integer; Function tz(n:integer):integer; Begin If n=1 then tz:=1 Else If n=2 then tz:=1 Else tz:=tz(n-1)+tz(n-2); End; Begin Writeln(‘please input the day’); Readln(day); While day=0 do Readln(day); Writeln(tz(day)); End. 回顾递归算法概念 【递归的定义】 为了描述问题的某一状态,必须用到它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自已来定义自己的方法,称为递归定义。 例如:定义函数f(n)为: 则当n0时,须用f(n-1)来定义f(n),用f(n-1-1)来定义f(n-1)……当n=0时,f(n)=1。 由上例我们可看出,递归定义有两个要素: (1)递归边界条件。也就是所描述问题的最简单情况,它本身不再使用递归的定义。 如上例,当n=0时,f(n)=1,不使用f(n-1)来定义。 (2)递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。 如上例:f(n)由f(n-1)定义,越来越靠近f(0),也即边界条件。最简单的情况是f(0)=1。 二、递归算法用于解决的问题 一般来说,能够用递归解决的问题应该满足以下三个条件: 需要解决的问题可以化为一个或多个子问题来求解,而这些子问题的求解方法与原来的问题完全相同,只是在数量规模上不同; 递归调用的次数必须是有限的; 必须有结束递归的条件(边界条件)来终止递归。 二、递归算法用于解决的问题 可用递归解决的具体问题: 数据的定义形式是按递归定义的。如阶乘。 问题的解法按递归算法实现。如回溯算法。 数据结构的形式是按递归定义的。如树的遍历。 三、递归算法的执行过程 三、递归算法的执行过程 例3:求m与n的最大公约数。 〖问题分析〗: 从数学上可以知道求m与n的最大公约数等价于示n与(m MOD n)的最大公约数。这时可以把n当作新的m,(m MOD n)当作新的n,问题又变成了求新的m与n的最大公约数。它又等价于求新的n与(m MOD n)的最大公约数……如此继续,直到新的n=0时,其最大公约数就是新的m。 例如求24与16的最大公约数,等价于求16与(24 MOD 16)的最大公约数,即求16与8的最大公约数。它又等价于求8与(16 MOD 8)的最大公约数,即求8与0的最大公约数。此时n=0,最大公约数就是8(边界条件)。 这样我们可以得出递归模型为: 其中Gcd(m,n)代表求m与n的最大公约数。 参考程序 Var m,n,g:integer; function gcd(m,n:integer):integer; begin if n=0 then gcd:=m else gcd:=gcd(n,m MOD n); end; begin read(m,n); g:=gcd(m,n); writeln(m=,m,n=,n,gcd=,g); end. 递归算法适用的一般场合为 1. 数据的定义形式按递归定义. 如裴波那契数列的定义: f(n)=f(n-1)+f(n-2); f(0)=1; f(1)=2. 对应的递归程序为: Function fib(n : integer) : integer; Begin if n = 0 then fib := 1 { 递归边界 } else if n = 1 then fib := 2 { 递归边界 } else fib := fib(n-2) + fib(n-1) { 递归 } End; 这类递归问题可转化为递推算法, 递归
文档评论(0)