C++递归函数ppt课件.ppt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C++ 递归 函数 ppt 课件
- 资源描述:
-
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,递 归 函 数,递归概念,设计方法步骤,执行过程,递归与迭代,典型案例,1,【,引例,1】,赏麦粒,国际象棋发明人西萨,班,达依尔在国王问赏时说:,“,陛下,请您在这张棋盘的第,1,个小格里赏给我一粒麦子,在第,2,个小格里给,2,粒,第,3,个小格给,4,粒,以后每一小格都比前一小格加一倍。请您把这样摆满棋盘上所有,64,格的麦粒,”,?,需要多少粒麦子,f(1)=1;,f(2)=2;,f(3)=4;,f(n)=2*f(n-1);,f(64)=2,64,-1=18446744073709551615,什么特点?,2,【,引例,2】,汉诺塔问题,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着,64,片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。,3,解决方法,要实现将,64,个圆盘从第一根柱子移到第三根柱子,首先要完成将最上面的,63,个圆盘移到第二根柱子上,然后再将最下面的一个圆盘移到第三根柱子上。这样,如何移动,64,个圆盘的问题就转换成了如何移动,63,个圆盘问题,依次类推,解决问题的规模可以逐步降低为解决移动,62,、,61,、,60,3,、,2,、,1,个圆盘的问题。,以上两个例子都是递归问题,4,一、递归的概念,1,、定义,2,、特点,3,、典型类型,5,1,、定义,递归方法是指通过函数或过程调用自身,将问题转化为,本质相同,但,规模较小,的子问题的方法。如果是直接调用自身,称为直接递归;如果是通过其它函数或过程间接调用自身,则称为间接递归。递归方法是算法和程序设计中的一种重要技术,是许多复杂算法的基础。,A(),A();,A(),B();,B(),A();,直接递归,间接递归,6,2,、特点,原始问题可转化为解决,方法相同,的新 问题;,新问题的规模,比原始问题小,;,新问题又可转化为解决方法相同的规模更小的新问题,直至,终结条件,为止。,7,3,、典型类型,问题定义是递归的,如,阶乘的定义:,(,n=0),(n0),n!=,写成函数形式则为:,(,n=0),(n0),f(n)=,这种函数定义形式是用阶乘函数自己本身定义了自身,故是一种递归定义。,8,数据结构是递归的,如前面介绍的链表的结点结构定义:,struct node,int data;,struct node*next;,其中,指针域,next,是指向自身类型的指针,故该数据结构是一种递归数据结构。,9,对于递归数据结构,采用递归方法编写算法简单有效。如:,int sum(node*head),if(head=NULL),;,else,return(head-data+);,以上函数用递归算法实现了求解以,head,做表头指针的链表的所有结点数据的和。,return 0,sum(head-next),10,问题求解过程是递归的,如,前面数组一章中介绍的在有序数组中查找某一数据是否存在于数组中的,折半查找,算法,其求解过程便是一个递归求解的过程。即不断在前一次区间一半的搜索区间范围内重复着与前一次搜索相同的操作。具体实现后面给出。,11,二、设计方法步骤,基本思想:,将一复杂问题分解成若干简单且相同的子问题,这样较为复杂的原问题就转换为简单的子问题,而简单到一定程度的子问题可以直接求解,则原问题可递推得到解。,递归算法所需条件:,存在,递归结束条件及结束时的值,能用递归形式表示,且,递归向终止条件发展,12,递归模型:,递归模型是递归算法的抽象,反映递归问题的递归结构。以阶乘求解为例,其对应的递归模型为:,fun(0)=1 (1),fun(n)=n*fun(n-1)n0 (2),式子(,1,)给出了递归的终止条件,被称为,递归出口,;式子(,2,)给出了,fun(n),与,fun(n-1),之间的关系,被称为,递归体,。,13,设计步骤:,描述递归关系,确定递归出口,写出递归函数,int,f(int,n),if,(n=0),return(1);,else,;,return(n*f(n-1),14,int fac(int n),if(n=1),return(1);,else,return(fac(n-1)*n);,void main(),int y;,y=f(4),couty;,?,为什么能计算,n!,考察程序执行过程,:,(分为递推和回归两个过程),int fac(int n),if(n=1),return(1);,else,return(fac(n-1)*n);,int fac(int n),if(n=1),return(1);,else,return(fac(n-1)*n);,int fac(int n),if(n=1),return(1);,else,return(fac(n-1)*n);,int fac(int n),if(n=1),return(1);,else,return(fac(n-1)*n);,第一次调用:,n,为,4,第二次调用:,n,为,3,第三次调用:,n,为,2,第四次调用:,n,为,1,三、执行过程,返回,1,返回,1*2,返回,1*2*3,返回,1*2*3*4,15,分解,?,递归函数,反映一种什么样的思维,问题,小问题,n!,(n-1)!,问题,分解,小问题,更小问题,最小问题,分解,分解,不能再分解,n!,(n-1)!,(n-2)!,1!,16,四、递归与迭代,用迭代法求,n!,s=1;,for(i=1;i1,fib(n)=,21,f(1)=1,f(2)=1,f(n)=f(n-1)+f(n-2),问题,子问,题,1,子问,题,2,与,f(n),f(n-1),f(n-2),int fib(int n),if(),return(1);else,与的关系:,子问题解决了,大问题就解决了,递归出口,递归体,n=1|n=2,return(fib(n-1)+fib(n-2);,22,2,、猴子吃桃子,小猴在一天摘了若干桃,当天吃掉一半多一个,第二天接着吃掉剩下的一半多一个,以后每天都吃掉尚存桃子的一半多一个,第,7,天早上只剩,1,个,问小猴摘了多少个桃?,分析:,由题意知,第,n,天的桃子个数应是第,n+1,天个数加,1,以后的,2,倍,故可归纳出:,递归体:,f(n)=(f(n+1)+1)*2,递归出口,:f(7)=1,23,int f(int n),;,else,;,递归函数定义如下:,if(n=7),return 1,return(f(n+1)+1)*2,24,3,、十进制整数转换成二至九任意进制数,void f(int n,int r),if(n!=0),f(n/r,r);,coutn%r;,调用 输出,f(100,8)4,f(12,8)4,f(1,8)1,f(0,8),递归出口为,n=0,最先分解出的最后输出,若转换成,216,进制呢?,void f(int n,int r),if(n=0),return;,else,f(n/r,r);,coutn%r;,或:,25,4,、二分法查找的递归实现,在,low,和,high,之间查找,在,low,和,mid-1,之间查找,在,mid+1,和,high,之间查找,结果是,amid,int Binary_Search(int low,int high),if()return-1;,int mid=(low+high)/2;,if(key=amid)return mid;,else if(keyhigh,return Binary_Search(low,mid-1),return Binary_Search(mid+1,high),26,5,汉诺塔问题,有,A,、,B,和,C,三根柱子。,A,上从上到下按照从小到大的顺序摞着,n,个圆盘。要求借助,B,从,A,上将,n,个圆盘移到,C,上。移动规定:一次只能移动,1,个圆盘,小圆盘上不能放大圆盘,递归分析:,借助,C,从,A,上将,n-1,个圆盘移到,B,上,从,A,上将,1,个圆盘移到,C,上,借助,A,从,B,上将,n-1,个圆盘移到,C,上,27,大问题,:,hanoi(n,A,B,C),子问题,1,子问题,2,:,子问题,3,:,将,n,个盘从,one,座借助,two,座,移到,three,座,:,void hanoi(int n,char one,char two,char three);,hanoi(n-1,A,C,B);,move(A,C);,hanoi(n-1,B,A,C);,28,#include iostream.h,void main(),void hanoi(int n,char one,char two,char three);,int m;,cinm;,hanoi(m,A,B,C);,void hanoi(int n,char one,char two,char three),void move(char x,char y);,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 x,char y),coutyn;/,递归深度,initgraph(600,600);/,初始化屏幕大小,600*600,drawpic(300,300,500,n);,getch();,closegraph();,三角形中心点坐标,边长,递归深度,32,void drawpic(double x,double y,double len,int k),double x1,y1,x2,y2,x3,y3,x01,y01,x02,y02,x03,y03;,if(k=1),x1=x-len/2;y1=y+len/2*tan(PI/6);,x2=x+len/2;y2=y+len/2*tan(PI/6);,x3=x;y3=y-len*tan(PI/6);,line(x1,y1,x2,y2);,line(x2,y2,x3,y3);,line(x3,y3,x1,y1);,else,x01=x-len/4;y01=y+len*tan(PI/6)/4;,x02=x+len/4;y02=y+len*tan(PI/6)/4;,x03=x;y03=y-len*tan(PI/6)/2;,drawpic(x01,y01,len/2,k-1);,drawpic(x02,y02,len/2,k-1);,drawpic(x03,y03,len/2,k-1);,递归出口,33,展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




C++递归函数ppt课件.ppt



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/12674947.html