C++函数、递推、递归.ppt
《C++函数、递推、递归.ppt》由会员分享,可在线阅读,更多相关《C++函数、递推、递归.ppt(77页珍藏版)》请在三一办公上搜索。
1、C+语言程序设计,第九讲函数、递推、递归,大连理工大学 盘锦校区基础教学部,2,第九讲函数、递推、递归递推递推是计算机数值计算中的一个重要算法。,思路:通过数学推导,将复杂的运算化解为若干重复的简单运算,以充分发挥计算机长于重复运算的特点;递推法特点:从一个已知的事实出发,按一定规律推 出下一个事实,再从这个新的已知事实出发,再向下 推出一个新的事实。,大连理工大学 盘锦校区基础教学部,3,第九讲函数、递推、递归,递推举例(1),例:(猴子吃桃问题)猴子第1天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一 半
2、另加一个。到第10天早上想再吃时,就只剩下一个 桃子了。问第1天猴子共摘了多少桃子?,大连理工大学 盘锦校区基础教学部,4,第九讲函数、递推、递归,解题思路:,假设用 S(i)表示第 i天没吃之前的桃子数目;则S(1)即为第 1天所摘的桃子数;,S(10)=S(9)*1/2 1第10 天没吃之前的桃子数,大连理工大学 盘锦校区基础教学部,5,第九讲函数、递推、递归,一般形式:S(i)=S(i-1)*1/2 1,i=2,3,10;这个公式可用于知第 1 天没吃之前的桃子数推算第 2 天 没吃之前的,再推算第 3天没吃之前的,.。现在要求的是 第 1 天没吃之前的。能否倒过来,先知 第 10 天没
3、吃之前的 的再反推第 9天没吃之的,直到第 1 天没吃之前的。为 此将上式改写为:S(i-1)=2*(S(i)+1),i=10,9,8,2,第九讲函数、递推、递归,程序:,大连理工大学 盘锦校区基础教学部 6,大连理工大学 盘锦校区基础教学部,7,第九讲函数、递推、递归分析:一般形式:S(i-1)=2*(S(i)+1),i=10,9,8,2;初始:s2=1;/S(10)=1,i=9,s1=2*(s2+1);s2=s1;s1=2*(s2+1);s2=s1;s1=2*(s2+1);s2=s1;,/S(9)=2*(S(10)+1)/s2=s1=S(9)/S(8)=2*(S(9)+1)/s2=s1=S
4、(8)/S(7)=2*(S(8)+1)/s2=s1=S(7),i=8,i=7,i=6,s1=2*(s2+1);s2=s1;,/S(6)=2*(S(7)+1)/s2=s1=S(6),大连理工大学 盘锦校区基础教学部,8,第九讲函数、递推、递归,i=5,s1=2*(s2+1);s2=s1;,/S(5)=2*(S(6)+1)/s2=s1=S(5)/S(4)=2*(S(5)+1)/s2=s1=S(4)/S(3)=2*(S(4)+1)/s2=s1=S(3)/S(2)=2*(S(3)+1)/s2=s1=S(2)/S(1)=2*(S(2)+1)/s2=s1=S(1),i=4,s1=2*(s2+1);s2=s
5、1;s1=2*(s2+1);s2=s1;s1=2*(s2+1);s2=s1;s1=2*(s2+1);s2=s1;,i=3,i=2,i=1,大连理工大学 盘锦校区基础教学部,9,第九讲函数、递推、递归,递推举例(2),递推数列 一个数列从某一项起,它的任何一项都可以用它前面的若干项 来确定,这样的数列称为递推数列,表示某项与其前面的若干 项的关系就称为递推公式。例如自然数 1,2,,n 的阶乘就可 以形成如下数列:1!,2!,3!,,(n-1)!,n!另fact(n)为 n 阶乘,依据后项与前项的关系可以写出递推公式:fact(n)=n*fact(n-1)(通项公式)fact(1)=1(边界条件
6、),大连理工大学 盘锦校区基础教学部,10,第九讲函数、递推、递归,递推算例(3),递推算法程序实现:有了通项公式和边界条件后,采用循环结构,从边界条件出 发,利用通项公式通过若干步递推过程就可以求出结果;例:王小二自称刀工不错,有人放一张大的煎饼在砧板上,问他:“饼不许离开砧板,切 100 刀最多能分成多少块?”,大连理工大学 盘锦校区基础教学部,11,第九讲函数、递推、递归,分析:,切一刀,切二刀,切三刀切四刀,令 q(n)表示切 n刀能分成的块数,由上图可知q(1)=1+1=2q(2)=1+1+2=4q(3)=1+1+2+3=7q(4)=1+1+2+3+4=11,大连理工大学 盘锦校区基
7、础教学部,12,第九讲函数、递推、递归,分析:,切一刀,切二刀,切三刀切四刀,在切法上是让每两条线都有交点。用归纳法可得出q(n)=q(n-1)+nq(0)=1(边界条件),大连理工大学 盘锦校区基础教学部,13,第九讲函数、递推、递归,递推算例(3,),参考程序:,大连理工大学 盘锦校区基础教学部,14,第九讲函数、递推、递归递归递归算法在可计算理论中占有重要地位,它是算法设计的有力工具,对于拓展编程思路非常有用。就递归算法而言不涉及高深数学知识,只不过初学者建立起递 归概念不太容易。看一个简单的例子:,大连理工大学 盘锦校区基础教学部,15,第九讲函数、递推、递归递归有5 个人坐在一起,问
8、第 5 个人多少岁?他说比第 4个人大两岁。问第4 个人岁数,他说比第 3 个人大两岁。问第 3个人,又说比第 2个人大两岁。问第 2个人,说比第 1个人大两岁。最后问第 1个人,他说是 10岁。请问第 5 个人多大?解题思路:假设用 age(i)表示第 i个人的岁数,则,借助循环结构采用递推方法求解!,大连理工大学 盘锦校区基础教学部,16,第九讲函数、递推、递归,一般形式:,age(n)=10age(n)=age(n-1)+2,(n=1)(n 2),大连理工大学 盘锦校区基础教学部,17,第九讲函数、递推、递归,分析:上述求解是从求解目标出发,即将第 n 个人的年龄表示第(n-1)个人的年
9、龄,再回溯到第(n-2)个人的年龄 直 到第 1 个人的年龄;(回溯阶段)然后,采用递推方法,从第 1 个人的已知年龄推算第 2 个人的年龄,在推算第 3个人的年龄,直到推算出第 5个人的 年龄;(递推阶段)这是一个递归问题,对它的求解可以分成 回溯 和 递推 两 个阶段;显而易见,如果不希望递归过程无限制的进行下去,必须有一个结束递归过程的条件;如:age(1)=10,大连理工大学 盘锦校区基础教学部,18,第九讲函数、递推、递归,计算年龄函数:int age(int n),int c;if(n=1)c=10;else c=age(n-1)+2;return c;,大连理工大学 盘锦校区基础
10、教学部,19,第九讲函数、递推、递归,递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归(recursive)调用;C+允许函数的递归调用;例:int f(int x)int y,z;z=f(y);return 2*z;,大连理工大学 盘锦校区基础教学部,20,第九讲函数、递推、递归,递归调用,直接调用,间接调用,注意:上述两种情况都是无终止的自身调用;显然,程序中不应该出现这种无终止的调用,而只应出现 有限次的,有终止的递归调用;可以用if语句控制,实现递归调用结束;,大连理工大学 盘锦校区基础教学部,21,第九讲函数、递推、递归,递归函数,包含递归调用的函数,
11、称为递归函数;计算年龄函数:int age(int n)int c;,if(n=1)c=10;,else c=age(n-1)+2;return c;,大连理工大学 盘锦校区基础教学部,22,第九讲函数、递推、递归,递归函数,计算年龄递归函数执行过程:,大连理工大学 盘锦校区基础教学部,23,第九讲函数、递推、递归,计算年龄程序,大连理工大学 盘锦校区基础教学部,24,第九讲函数、递推、递归,递归算例(2),用递归方法计算 n!算法思路:若 n=10,则 n!=10*9!定义函数 fact(n)表示计算 n!的函数,则有,大连理工大学 盘锦校区基础教学部,25,第九讲函数、递推、递归,递归算例
12、(2),阶乘计算递归函数:iinntt ffaacctt(iinntt nn)int c;if(cn=n=*0 f|anct=(n=-11);c=1;reelstuern c;,c=n*fact(n-1);return c;,结束递归条件,大连理工大学 盘锦校区基础教学部,26,第九讲函数、递推、递归,递归算例(3),用递归函数计算组合数:C(m,n),即从 m 个数中取 n 个数的组合数;C(m,n)=C(m-1,n)+C(m-1,n-1);C(m,n)=0,m 0,n 0;C(m,n)=1,m=n;C(m,n)=m,n=1;,大连理工大学 盘锦校区基础教学部,27,第九讲函数、递推、递归,
13、递归算例(3),大连理工大学 盘锦校区基础教学部,28,第九讲函数、递推、递归,递归算例(4),例:(猴子吃桃问题)猴子第1天摘下若干桃子,当即吃了一半,还不过瘾,又多吃了一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一 半另加一个。到第10天早上想再吃时,就只剩下一个 桃子了。问第1天猴子共摘了多少桃子?,大连理工大学 盘锦校区基础教学部,29,第九讲函数、递推、递归,解题思路:,假设用 S(i)表示第 i天没吃之前的桃子数目;则S(1)即为第 1天所摘的桃子数;,S(10)=S(9)*1/2 1第10 天没吃之前的桃子数,大连理工大学 盘锦校区基础教学
14、部,30,第九讲函数、递推、递归,一般形式:S(i)=S(i-1)*1/2 1,i=2,3,10;这个公式可用于知第 1 天没吃之前的桃子数推算第 2 天 没吃之前的,再推算第 3天没吃之前的,.。现在要求的是 第 1 天没吃之前的。能否倒过来,先知 第 10 天没吃之前的 的再反推第 9天没吃之的,直到第 1 天没吃之前的。为 此将上式改写为:,大连理工大学 盘锦校区基础教学部,31,第九讲函数、递推、递归,一般形式:,S(i-1)=2*(S(i)+1),i=2,3,4,10,则S(1)即为第 1天所摘的桃子数;S(1)=2*(S(2)+1)S(2)=2*(S(3)+1)S(8)=2*(S(
15、9)+1)S(10)=1,大连理工大学 盘锦校区基础教学部,32,第九讲函数、递推、递归,递归函数:int count(int n),int c;if(n=10)c=1;elsec=2*(count(n+1)+1);return c;,这样可以吗?有没有问题?,如果出现调用语句:count(11)?,大连理工大学 盘锦校区基础教学部,33,第九讲函数、递推、递归,递归函数:int count(int n),int c;if(n 10)return-1;if(n=10)c=1;elsec=2*(count(n+1)+1);return c;,大连理工大学 盘锦校区基础教学部,34,第九讲函数、递
16、推、递归,递归方法,递归实现:在时间和空间上的开销比较大;但符合人们的思路,程序容易理解;递归函数:只须写出递归公式和递归结束条件(即边 界条件),即可很容易写出递归函数;,大连理工大学 盘锦校区基础教学部,35,第九讲函数、递推、递归,局部变量和全局变量,一个程序可以包括若干个源程序文件(文件模块);每个源程序文件又包括若干个函数;在每个函数中和函数外都可以定义变量。这些在不同地方定义的变量是否都在程序的全部范围 内有效?如果不是,他们的有效范围是什么呢?,大连理工大学 盘锦校区基础教学部,36,第九讲函数、递推、递归,局部变量和全局变量,局部变量在一个函数内部定义的变量是内部变量,它只在
17、本函数范围内有效,换句话说只有在本函数内才能使 用它们,在此函数之外是不能使用这些变量的。同样 的,在复合语句中定义的变量只在复合语句内范围内 有效。,大连理工大学 盘锦校区基础教学部,37,第九讲函数、递推、递归,float f1(int a),/函数f1,int b,c;char f2(intint i,j;int main()int m,n;int p,q;,b、c有效,a有效,x,int y)i、j有效,/函数f2,x、y有效,/主函数,p、q在复合语句中有效,m、n有效,38,第九讲函数、递推、递归,a也只在f1函数中有效。其他函数不能调用。大连理工大学 盘锦校区基础教学部,说明:,
18、(1)主函数main中定义的变量(m,n)也只在主函数 中有效,不会因为在主函数中定义而在整个文件或 程序中有效。主函数也不能使用其他函数中定义的 变量。(2)不同函数中可以使用同名的变量,它们代表不 同的对象,互不干扰。例如,在f1函数中定义了变量 b和c,倘若在f2函数中也定义变量b和c,它们在内存 中占不同的单元,不会混淆。(3)可以在一个函数内的复合语句中定义变量,这 些变量只在本复合语句中有效,这种复合语句也称 为分程序或程序块。(4)形式参数也是局部变量。例如f1函数中的形参,大连理工大学 盘锦校区基础教学部,39,第九讲函数、递推、递归,(5)在函数声明中出现的参数名,其作用范围
19、只在本 行的括号内。实际上,编译系统对函数声明中的变量 名是忽略的,即使在调用函数时也没有为它们分配存,储单元。例如,int max(int a,int b);int max(int x,inty)coutxyendl;coutabendl;,/函数声明中出现a、b,/函数定义,形参是x、y/合法,x、y在函数体中有效/非法,a、b在函数体中无效,编译时认为max函数体中的a和b未经定义。,大连理工大学 盘锦校区基础教学部,40,第九讲函数、递推、递归,全局变量,程序的编译单位是源程序文件(.cpp),一个源文 件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定 义的变量
20、是外部变量,称为全局变量(global variable,也称全程变量)。全局变量的有效范围为从定义变量的位置开始到 本源文件结束。如,大连理工大学 盘锦校区基础教学部,41,第九讲函数、递推、递归,int p=1,q=5;/全局变量,float f/定义函数f1,1(a),int a;,围,全局变量c1、c2的作用范围,(int a),大连理工大学 盘锦校区基础教学部,42,第九讲函数、递推、递归,p、q、c1、c2都是全局变量,但它们的作用范围不 同,在main函数和f2函数中可以使用全局变量p、q、c1、c2,但在函数f1中只能使用全局变量p、q,而 不能使用c1和c2。,在一个函数中既
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 函数 递归
链接地址:https://www.31ppt.com/p-6153956.html