6C函数递推递归.ppt
- 文档编号:1381834
- 上传时间:2022-10-21
- 格式:PPT
- 页数:22
- 大小:1.16MB
6C函数递推递归.ppt
《6C函数递推递归.ppt》由会员分享,可在线阅读,更多相关《6C函数递推递归.ppt(22页珍藏版)》请在冰豆网上搜索。
第六章函数和递推递归算法,第一节函数,第二节递推算法,第三节递归算法,第一节函数,前面我们曾经学习了程序设计中的三种基本控制结构(顺序、分支、循环)。
用它们可以组成任何程序。
但在应用中,还经常用到子程序结构。
通常,在程序设计中,我们会发现一些程序段在程序的不同地方反复出现,此时可以将这些程序段作为相对独立的整体,用一个标识符给它起一个名字,凡是程序中出现该程序段的地方,只要简单地写上其标识符即可。
这样的程序段,我们称之为子程序。
子程序的使用不仅缩短了程序,节省了内存空间及减少了程序的编译时间,而且有利于结构化程序设计。
因为一个复杂的问题总可将其分解成若干个子问题来解决,如果子问题依然很复杂,还可以将它继续分解,直到每个子问题都是一个具有独立任务的模块。
这样编制的程序结构清晰,逻辑关系明确,无论是编写、阅读、调试还是修改,都会带来极大的好处。
在一个程序中可以只有主程序而没有子程序(本章以前都是如此),但不能没有主程序,也就是说不能单独执行子程序。
在此之前,我们曾经介绍并使用了C+提供的各种标准函数,如abs(),sqrt()等等,这些系统提供的函数为我们编写程序提供了很大的方便。
比如:
求sin
(1)+sin
(2)+sin(100)的值。
但这些函数只是常用的基本函数,编程时经常需要自定义一些函数。
例6.1求:
1!
+2!
+3!
+10!
#includeusingnamespacestd;intmain()intsum=0;for(inti=1;i=10;i+)sum+=js(i);coutsum=sumendl;return0;现在的问题是:
C+不提供js(x)这样一个标准函数,这个程序是通不过的。
如果是C+的标准函数,我们可以直接调用,如abs(x),sqrt(x)而C+提供给我们的可供直接调用的标准函数不多。
没关系,我们编写自己的函数!
一、函数的定义-【函数】,1.函数定义的语法形式数据类型函数名(形式参数表)函数体/执行语句关于函数的定义有如下说明:
函数的数据类型是函数的返回值类型(若数据类型为void,则无返回值)。
函数名是标识符,一个程序中除了主函数名必须为main外,其余函数的名字按照标识符的取名规则可以任意选取,最好取有助于记忆的名字。
形式参数(简称形参)表可以是空的(即无参函数);也可以有多个形参,形参间用逗号隔开,不管有无参数,函数名后的圆括号都必须有。
形参必须有类型说明,形参可以是变量名、数组名或指针名,它的作用是实现主调函数与被调函数之间的关系,通常将函数所处理的,数据、影响函数功能的因素或者函数处理的结果作为形参。
在被调用函数中的参数被称为形参。
函数中最外层一对花括号“”括起来的若干个说明语句和执行语句组成了一个函数的函数体。
由函数体内的语句决定该函数功能。
函数体实际上是一个复合语句,它可以没有任何类型说明,而只有语句,也可以两者都没有,即空函数。
函数不允许嵌套定义。
在一个函数内定义另一个函数是非法的。
但是允许嵌套使用。
函数在没有被调用的时候是静止的,此时的形参只是一个符号,它标志着在形参出现的位置应该有一个什么类型的数据。
函数在被调用时才执行,也就是在被调用时才由主调函数将实际参数(简称实参)值赋予形参。
这与数学中的函数概念相似,如数学函数:
f(x)=x2+x+1这样的函数只有当自变量被赋值以后,才能计算出函数的值。
2函数定义的例子定义一个函数,返回两个数中的较大数。
intmax(intx,inty)returnxy?
x:
y;该函数返回值是整型,有两个整型的形参,用来接受实参传递的两个数据,函数体内的语句是求两个数中的较大者并将其返回主调函数。
3函数的形式函数的形式从结构上说可以分为三种:
无参函数、有参函数和空函数。
它们的定义形式都相同。
(1)无参函数无参函数顾名思义即为没有参数传递的函数,无参函数一般不需要带回函数值,所以函数类型说明为void。
(2)有参函数有参函数即有参数传递的函数,一般需要带回函数值。
例如intmax(intx,inty)函数。
(3)空函数空函数即函数体只有一对花括号,花括号内没有任何语句的函数。
例如,函数名()空函数不完成什么工作,只占据一个位置。
在大型程序设计中,空函数用于扩充函数功能。
编写一个阶乘的函数,我们给此函数取一个名字js。
intjs(intn)ints=1;for(inti=1;i=n;+i)s*=i;returns;在本例中,函数名叫js,只有一个int型的自变量n,函数js属int型。
在本函数中,要用到两个变量i,s。
在函数体中,是一个求阶乘的语句,n的阶乘的值在s中,最后由return语句将计算结果s值带回,js()函数执行结束,在主函数中js()值就是s的值。
在这里,函数的参数n是一个接口参数,说得更明确点是入口参数。
如果我们调用函数:
js(3),那么在程序里所有有n的地方,n被替代成3来计算。
在这里,3就被称为实参。
又如:
sqrt(4),ln(5),这里4,5叫实参。
而ln(x),sqrt(x)中的x,y叫形参。
二、参数传递-【函数】,1.非引用参数普通的非引用类型的参数是通过复制对应的实参实现初始化。
当用参数副本初始化形参时,函数并没有访问调用所传递的实参本身,因此不会修改实参的值。
举个例子:
#includeusingnamespacestd;voidswap(inta,intb)inttmp=a;a=b;b=tmp;intmain()intc=1,d=2;swap(c,d);coutcdendl;return0;/程序输出为:
12在此例中,虽然在swap函数中交换了a,b两数的值,但是在main中却没有交换。
因为swap函数只是交换c,d两变量副本的值。
2.引用参数引用参数直接关联到其所绑定的对象,而并非这些对象的副本。
定义引用时,必须用与该引用绑定对象初始化该引用。
引用形参完全以相同的方式工作。
每次调用函数,引用形参被创建并与相应实参关联。
现在用引用参数来实现swap:
#includeusingnamespacestd;voidswap(int/程序输出为:
21在此例中,因为swap函数的参数为引用参数,所以,在函数swap中修改a,b的值相当于在主函数main中修改c,d的值。
3.const形参使用const修饰参数可避免在函数执行中修改参数。
举个例子:
voidsolve(constint/错误,因为fb()使用了非常量引用形参,不可以接受常量2。
三、函数的声明和调用-【函数】,1函数的声明调用函数之前先要声明函数原型。
在主调函数中,或所有函数定义之前,按如下形式声明:
类型说明符被调函数名(含类型说明的形参表);如果是在所有函数定义之前声明了函数原型,那么该函数原型在本程序文件中任何地方都有效,也就是说在本程序文件中任何地方都可以依照该原型调用相应的函数。
如果是在某个主调函数内部声明了被调用函数原型,那么该原型就只能在这个函数内部有效。
函数原型和函数定义在返回值类型、函数名和参数个数与类型必须完全一致,否则,就会发生编译错误。
下面对max()函数原型声明是合法的。
intmax(intx,inty);也可以:
intmax(int,int);可以看到函数原型声明与函数定义时的第一行类似,只多了一个分号,成为了一个声明语句而已。
2函数的调用声明了函数原型之后,便可以按如下形式调用函数:
函数名(实参列表)实参列表中应给出与函数原型形参个数相同、类型相符的实参。
在主调函数中的参数称为实参,实参一般应具有确定的值。
实参可以是常量、表达式,也可以是已有确定值的变量,数组或指针名。
函数调用可以作为一条语句,这时函数可以没有返回值。
函数调用也可以出现在表达式中,这时就必须有一个明确的返回值。
3函数的返回值在组成函数体的各类语句中,值得注意的是返回语句return。
它的一般形式是:
return(表达式);其功能是把程序流程从被调函数转向主调函数并把表达式的值带回主调函数,实现函数的返回。
所以,在圆括号表达式的值实际上就是该函数的返回值。
其返回值的类型即为它所在函数的函数类型。
当一个函数没有返回值时,函数中可以没有return语句(在TC+和VC+,函数类型定义为void,可以没有return语句;函数类型定义为int,必须有返回值),直接利用函数体的右花括号“”,作为没有返回值的函数的返回。
也可以有return语句,但return后没有表达式。
返回语句的另一种形式是:
return;这时函数没有返回值,而只把流程转向主调函数。
四、函数的应用举例-【函数】,例6.2求1!
+2!
+10!
的值。
程序如下:
#includeusingnamespacestd;ntjs(int);intmain()intsum=0;for(inti=1;i=10;+i)sum+=js(i);coutsum=sumendl;return0;intjs(intn)ints=1;for(inti=1;i=n;+i)s*=i;returns;,例6.3任意输入10组三角形的三边,求其面积。
我们可以定义一个已知三角形三边求其面积的函数,设为area(a,b,c)。
程序如下:
#include#includeusingnamespacestd;doublearea(double,double,double);intmain()for(inti=1;iabc;if(a+b=c)|(a+c=b)|(b+c=a)coutdataerror!
endl;/判断三角形是否合法elsecouts=area(a,b,c)endl;return0;,doublearea(doublea,doubleb,doublec)/此函数为海伦秦九韶公式doublep=(a+b+c)/2;returnsqrt(p*(p-a)*(p-b)*(p-c);在函数说明中,如果形参的个数不止一个,那么在程序中调用函数的实参个数一定要与形参的个数一致,第一个实参对应第一个形参,第二个实参对应第二个形参次序不能对调。
例6.4定义一个函数check(n,d),让它返回一个布尔值。
如果数字d在正整数n的某位中出现则送回true,否则送回false。
例如:
check(325719,3)=true;check(77829,1)=false;#includeusingnamespacestd;boolcheck(int,int);intmain()inta,b;coutab;if(check(a,b)=true)couttrueendl;elsecoutfalseendl;return0;boolcheck(intn,intd)while(n)/C+中非0为真inte=n%10;n/=10;if(e=d)returntrue;returnfalse;,例6.5计算如图多边形的面积。
从图中可以看出,五边形的面积是三个三角形面积之和。
程序如下:
#include#include/使用printf和scanf语句,调用cstdio库#includeusingnamespacestd;doublearea(double,double,double);intmain()doubleb1,b2,b3,b4,b5,b6,b7,s;coutb1b2b3b4b5b6b7;s=area(b1,b5,b6)+area(b2,b6,b7)+area(b3,b4,b7);/调用三次函数areaprintf(s=%10.3lfn,s);return0;doublearea(doublea,doubleb,doublec)doublep=(a+b+c)/2;returnsqrt(p*(p-a)*(p-b)*(p-c);,例6.6输出以下一个图形【分析】我们前面学习可用二重循环打印出上图形,现我们设置一个函数打印出n个连
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 函数 递归