什么是递归new.pptVIP

  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文档。上传文档
查看更多
引例1:需要多少粒麦子? 舍罕王打算奖赏国际象棋的发明人──宰相西萨·班·达依尔。国王问他想要什么,他对国王说:“陛下,请您在这张棋盘的第1个小格里赏给我一粒麦子,在第2个小格里给2粒,第3个小格给4粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有64格的麦粒,都赏给您的仆人吧!”国王觉得这个要求太容易满足了,就命令给他这些麦粒。当人们把一袋一袋的麦子搬来开始计数时,国王才发现:就是把全印度甚至全世界的麦粒全拿来,也满足不了那位宰相的要求。 需要多少粒麦子? f(1)=1; f(n)=2*f(n-1); 递归与递归函数 引例1:汉诺塔问题: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。 演示 : n=1 n=2 n=3 ……n=8 这是一个递归的问题,需要用递归的方法来解决 1什么是递归? 课堂练习1: 分析程序的运行结果: Void f(int n,int r) { if (n!=0) {f=f(n/r,r); coutn%r; } } Void main() {f(100,8);} 2递归算法一般用于解决哪些问题? 一般用于解决三类问题: (1)数据的定义是按递归定义的。 Fibonacci Sequence f(n)=f(n-1)+f(n-2) 出口:f(1)=1,f(0)=1 阶乘:n!=n*(n-1)! 出口: 1!=1 猴子吃桃 递归: #include iostream.h #include iomanip.h long f(int n) { if (n==1) return 1; else if (n==2) return 1; else return f(n-1)+f(n-2); } void main() {int n; cout输入n,求数列的第n个数endl; cinn; cout数列的第n个数: f(n) endl; } 静态变量: long f1(int n) {long x; static int x1=1,x2=1; if (n==1 ) return x1; else if (n==2) return x2; else { x=x1+x2; x1=x2; x2=x; return x; } } 猴子吃桃 小猴在一天摘了若干桃,当天吃掉一半多一个,第二天接着吃掉剩下的一半多一个,以后每天都吃掉尚存桃子的一半多一个,第7天早上只剩1个,问小猴摘了多少个桃? int f(int n) { if (n==7) return 1; else return (f(n+1)+1)*2; } void main() {coutf(1); } (2)问题解法按递归算法实现。 汉诺塔问题 二分查找 出口:找到x或lowhigh 辗转相除法求m,n最大公约数 出口: r=0 数制转换(m转换成r进制) 出口:m=0 递归图形打印 汉诺塔 #include iostream.h #include iomanip.h void hanoi(int n,char one,char two,char three) {void move(char getone,char putone); if(n==1) move(one,three); else { hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); } } void move(char getone,char putone) { coutgetone--putoneendl; } void main() {int m; coutInput the number of disk:endl; cinm; coutthe steps of movingmdisks :endl; hanoi(m,A,B,C); } 打印字符图 从一个大的等边三角形开始,将其三条边的中点进行连线,分成相等的4个三角形, 除中间外的3个三角形再重复上述过程,直到满足规定的条件的底层。 void triangle(float x1,float x2,float

文档评论(0)

ajgoaw + 关注
文档贡献者

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

1亿VIP精品文档

相关文档