学校课件递归算法_3.pptxVIP

  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文档。上传文档
查看更多
;什么是递归? ;什么是递归? ;什么是递归? ;什么是递归? ; 著名的意大利数学家斐波那契(Fibonacci)在他的著作《算盘书》中提出了一个“兔子问题”:假定小兔子一个月就可以长成大兔子,而大兔子每个月都会生出一对小兔子。如果年初养了一对小兔子,问到年底时将有多少对兔子?? (当然得假设兔子没有死亡而且严格按照上述规律长大与繁殖);① 输入计算兔子的月份数:n ② If n 3 Then c = 1 Else a = 1;b = 1 ③ i = 3 ④ c = a + b a = b b = c ⑤ i=i+1,如果i≤n则返回④ ⑥ 结束; ; 仔细研究上页的表,你有些什么发现?每一个月份的大兔数、小兔数与上一个月的数字有什么联系,能肯定这个规律吗?恭喜你,你快成功了?; “兔子问题”很容易列出一条递推式而得到解决。假设第N个月的兔子数目是F(N),我们有:;第n个Fibonacci数可递归地计算如下: int fibonacci(int n) { if (n = 2) return 1; return fibonacci(n-1)+fibonacci(n-2); };边界条件;递归算法解决问题的特点:    递归就是在过程或函数里调用自身。    (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。     (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。   (4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。;递归算法要求    递归算法所体现的“重复”一般有三个要求:    一是每次调用在规模上都有所缩小(通常是减半);    二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);    三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。;二 如何设计递归算法    1.确定递归公式    2.确定边界(终了)条件;二 如何设计递归算法    1.确定递归公式    2.确定边界(终了)条件; 递推是计算机数值计算中的一个重??算法,可以将复杂的运算化为若干重复的简单运算,充分发挥计算机长于重复处理的特点,现举一例;例:分西瓜 一次比赛奖励一批西瓜,第一名得西瓜总数的一半加半只,第二名得剩下的西瓜的一半加半只,第三名得再次剩下的西瓜的一半加半只,西瓜正好分完,在分的过程中并没有用刀切西瓜。请编程计算西瓜总数有多少?;问题的前后过程之间有某种数量关系,即已知前项的值就能推算出其后项的值,这样的问题前后有递推关系。从已知前项的值就能推算出其后项的值,叫正向递推。(第一次分开始至最后一次);先从假设的某个前项的值出发,逐步按规定的分法(一半加半只)去推算出一结果。当分了三次如这结果等于已知的结果(分完),这假设的前项就是问题的解;如逐步推算出结果不等于已知的结果,就不断增加最初前项的值,再按同样的方法来推算结果。这样重复直到推算出的结果等于已知的结果为止。最后输出这时的前项的值就是问题的解。;从已知后项的值就能推算出其前项的值,叫逆推。开始从问题的已知结果出发,逐步推算出要问题最初的前项(即题目的解)。 ①最后分完 ②用剩下的西瓜,按某种方法来还原上一次剩下的西瓜干,这样还原三次 ③输出得到最初的西瓜总数; 这还原的方式是: 本次剩下的西瓜加上半个的是上次剩下西瓜的一半,所以: 上次剩下的西瓜=(上次剩下的西瓜+半个)×2 这就是反向递代的公式 ;【例题3】 A、B、C、D、E五人合伙夜间捕鱼,凌晨时都疲惫不堪,各自在河边的树丛中找地方睡着了,日上三竿,A第一个醒来,他将鱼平分作五份,把多余的一条扔回湖中,拿自己的一份回家去了,B第二个醒来,也将鱼平分为五份,扔掉多余的一条,只拿走自己的一份,接着C、D、E依次醒来,也都按同样的办法分鱼。问五人至少合伙捕到多少条鱼?每个人醒来后看到的鱼数是多少条?;解题思路:;写成一般式 fish [ i ] = ( fish [ i - 1 ] – 1 ) * 4 / 5 i = 2, 3, …,5 ;分析上式 1. 当 i = 5 时,fish[ 5 ] 表示 E 醒来所看到的鱼数,该数应满足被5整除后余1,即 fish[ 5 ] % 5 == 1 2. 当 i = 5 时,fish[ i-1 ] 表示 D 醒来所看到的鱼数,这个数既要满足 fi

文档评论(0)

183****7931 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档