函数函数(Function)是功能抽象的模块.ppt_第1页
函数函数(Function)是功能抽象的模块.ppt_第2页
函数函数(Function)是功能抽象的模块.ppt_第3页
函数函数(Function)是功能抽象的模块.ppt_第4页
函数函数(Function)是功能抽象的模块.ppt_第5页
已阅读5页,还剩146页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章 函数,函数(Function)是功能抽象的模块,函数,参数,返回值,输入流,输出流,第4章 函数,函数(Function)是功能抽象的模块,函数作用 实现一个功能;代码重用 函数是C+程序的重要组件,一个程序文件可以包含若干个函数,无论把一个程序划分为多少个程序模块,只能有一个main函数。,初步的认识,1 定义printstar和print_message函数时,括号内的void表示“没有参数函数”,即调用此函数时不必也不能给出参数。 2 程序的执行从main函数开始,调用其他函数后流程回到main函数,最后在main函数中结束整个程序的运行。 3 所有函数都是平行的,即在定义函数时是相互独立的。但函数不能嵌套定义,也即在定义一个函数过程中不能又定义另外一个函数,同时也不能把函数的定义部分写在主函数中。 4 main可以调用其他函数,各个函数之间可以互相调用,但不能调用main函数。 5 main函数所调用的函数,前面必须进行声明。,根据函数的形式: 无参函数:调用函数时,不必给出参数 有参函数:在调用函数时,要给出参数,函数定义由两部分组成:函数首部和函数操作描述,4.1 函数的定义,/ 求圆柱体体积 # include double volume ( double radius, double height ) return 3.14 * radius * radius * height ; void main() double vol, r, h ; cin r h ; vol = volume ( r, h ) ; cout “Volume = “ vol endl ; ,4.1 函数的定义,/ 求圆柱体体积 # include double volume ( double radius, double height ) return 3.14 * radius * radius * height ; void main() double vol, r, h ; cin r h ; vol = volume ( r, h ) ; cout “Volume = “ vol endl ; ,函数定义,4.1 函数的定义,/ 求圆柱体体积 # include double volume ( double radius, double height ) return 3.14 * radius * radius * height ; void main() double vol, r, h ; cin r h ; vol = volume ( r, h ) ; cout “Volume = “ vol endl ; ,函数调用,函数定义形式,类型 函数名 ( void ) 语句序列 ,4.2 函数参数,3.1.1 函数定义,类型 函数名 ( 形式参数表 ) 语句序列 ,无参函数,有参函数,形式参数和实际参数,形式参数:在定义函数时函数名后面括号中的变量名称为形式参数 实际参数:在主函数中调用一个函数时,函数后面括号中的参数,函数定义形式,类型 函数名 ( 形式参数表 ) 语句序列 ,4.2 函数定义和参数,函数头函数接口,包括:,3.1.1 函数定义,函数定义形式,类型 函数名 ( 形式参数表 ) 语句序列 ,4.2 函数定义和参数,函数头函数接口,包括:,函数返回值类型 函数体中由 return 语句返回的值的类型。没有 返回值其类型为void,3.1.1 函数定义,函数定义形式,类型 函数名 ( 形式参数表 ) 语句序列 ,4.2 函数定义和参数,函数头函数接口,包括:,函数返回值类型 函数体中由 return 语句返回的值的类型。没有 返回值其类型为void,函数名 用户定义标识符,3.1.1 函数定义,函数定义形式,类型 函数名 ( 形式参数表 ) 语句序列 ,4.2 函数定义和参数,函数头函数接口,包括:,函数返回值类型 函数体中由 return 语句返回的值的类型。没有 返回值其类型为void,函数名 用户定义标识符,形式参数表 逗号分隔的参数说明表列,缺省形式参数时不 能省略圆括号。一般形式为: 类型 参数1 ,类型 参数2 , ,类型 参数n,3.1.1 函数定义,函数定义形式,4.2 函数定义,函数头函数接口,类型 函数名 ( 形式参数表 ) 语句序列 ,函数体函数的实现代码。,3.1.1 函数定义,例3-1,4.2 函数定义,void printmessage ( ) cout “How do you do!“ endl ; ,3.1.1 函数定义,例3-1,4.2 函数定义,void printmessage ( ) cout “How do you do!“ endl ; ,函数返回值类型 无返回值,3.1.1 函数定义,例3-1,4.2 函数定义,void printmessage ( ) cout “How do you do!“ endl ; ,函数名,3.1.1 函数定义,例3-1,4.2 函数定义,void printmessage ( ) cout “How do you do!“ endl ; ,形式参数表 无参数,3.1.1 函数定义,例3-1,4.2 函数定义,void printmessage ( ) cout “How do you do!“ endl ; ,函数体 无 return 语句,3.1.1 函数定义,例3-2,4.2 函数定义,double max ( double x , double y ) if ( x y ) return x ; else return y ; ,3.1.1 函数定义,例3-2,4.2 函数定义,double max ( double x , double y ) if ( x y ) return x ; else return y ; ,函数返回值类型,3.1.1 函数定义,例3-2,4.2 函数定义,double max ( double x , double y ) if ( x y ) return x ; else return y ; ,函数名,3.1.1 函数定义,例3-2,4.2 函数定义,double max ( double x , double y ) if ( x y ) return x ; else return y ; ,形式参数表,3.1.1 函数定义,例3-2,4.2 函数定义,double max ( double x , double y ) if ( x y ) return x ; else return y ; ,函数体,3.1.1 函数定义,例3-2,4.2 函数定义,double max ( double x , double y ) if ( x y ) return x ; else return y ; ,返回值,return 语句形式: return 表达式 或 return (表达式 ) 作用: 返回函数值 不再执行后续语句,程序控制返回调用点 一个函数体内可以有多个return 语句 表达式 返回值的类型与函数类型不相同时, 自动强制转换成函数的类型,3.1.1 函数定义,(1)在定义函数时指定的形参,在未出现函数调用时,他们并不占内存中的存储单元,(所以称他们为形式参数或虚拟参数),表示他们并不是实际存在的数据。只有在发生函数调用时,函数中的形参才被分配内存单元,以便接受从实参传来的数据。在调用结束后,形参所占的内存单元也被释放。 (2)实参可以是常量,变量或表达式。 (3)定义函数时,必须在函数首部指定形参的类型。 (4)实参与形参的类型应相同或赋值兼容。如果两者不相同,则按照赋值的规则进行转换。 (5)实参变量对形参变量的数据传递时“值传递”,即单向传递,只有实参传给形参,而不能又形参传回给实参。,4.3 函数的返回值,函数通过匿名对象返回结果值 函数值的类型是匿名对象的类型 return 语句把表达式的值赋给匿名对象,Type FunctionName () / statements return expression ; ,expression,Type 可以为各种C+基本数据类型、类类型,以及这些类型 的指针或引用,3.2.4 函数的返回类型,(1) 函数的返回值是通过函数中的return语句获得的。return语句将被调用函数中的一个固定值带回主函数中。 (2)函数值的类型。既然函数有返回值,这个值的类型由定义函数时指定函数值的类型来确定。 (3)如果函数值的类型和return语句中的表达式的值不一致,则以函数类型为准,即函数类型决定返回值的类型。,调用形式,函数名 ( 实际参数表列 ),4.4 函数的调用,3.1.2 函数调用,如果调用无参函数,则“实际参数表列”可以没有,但括号不能省略。如果实参表列包括多个多个参数,则各参数间用逗号隔开。实参和形参的个数应该相等,类型匹配或者赋值兼容,顺序一一对应进行传递数据。,调用形式,函数名 ( 实际参数表 ),4.4 函数的调用,函数名 函数的入口地址,3.1.2 函数调用,调用形式,函数名 ( 实际参数表 ),4.4 函数的调用,函数名 函数的入口地址,实际参数表 与形式参数必须在个数、类型、位置一一对应,3.1.2 函数调用,4.4 函数的调用,按函数在语句中的作用来分,可以有以下3种函数调用方式: 1 函数语句:把函数调用单独作为一个语句,并不要求函数带回一个值,只是要求函数完成一定的操作。printstar(); 2 函数表达式:函数出现在一个表达式中,要求函数带回一个确定的值以参加表达式的运算。C=2*max(a,b) 3 函数参数:函数调用作为一个函数的实参。m=max(a,max(a,b);,4.4 函数调用,#include void printmessage () cout “How do you do!“ endl ; void main() printmessage() ; ,例3-1,3.1.2 函数调用,4.4 函数调用,#include void printmessage () cout “How do you do!“ endl ; void main() printmessage() ; ,函数调用语句,例3-1,3.1.2 函数调用,4.4 函数调用,例3-2,#include double max ( double x , double y ) if ( x y ) return x ; else return y ; void main() double a, b; cin a b ; double m = max( a, b ); cout max( m, 3.5 ) endl ; ,3.1.2 函数调用,4.4 函数调用,例3-2,#include double max ( double x , double y ) if ( x y ) return x ; else return y ; void main() double a, b; cin a b ; double m = max( a, b ); cout max( m, 3.5 ) endl ; ,函数调用表达式,3.1.2 函数调用,4.4 函数调用,例3-2,#include double max ( double x , double y ) if ( x y ) return x ; else return y ; void main() double a, b; cin a b ; double m = max( a, b ); cout max( m, a+3.5 ) endl ; ,cout max( max( a, b ) , a+3.5 ) endl ;,实际参数是表达式,3.1.2 函数调用,(1)首先被调用的函数必须是已经存在的函数(是函数库或者用户自己定义的函数) (2)如果是使用库函数,一般还应该在本文件开头用#include命令将有关头文件“包含”到本文件中来。例如,如果用到数学库函数,就用#include (3)如果使用用户自己定义的函数,该函数必须跟主函数在同一个程序单元中,如果位置在主函数之后,则必须在调用此函数之前对被调用函数之前进行声明。,4.4.1 调用函数的前提(调用函数的声明),定义函数和声明函数的区别,定义:对函数功能的确立,包括指定函数名,函数类型,形参及其类型,函数体等。是一个完整的、独立的函数单位。 声明:仅把函数的名字,函数类型及其形参的个数,类型和顺序通知编译系统。声明函数中可以不写形参名,而写形参的类型。如:,# include double volume ( double , double ) ; void main() double vol, r, h ; cin r h ; vol = volume ( r, h ) ; cout “Volume = “ vol endl ; double volume ( double radius, double height ) return 3.14 * radius * radius * height ; ,4.4.2 函数原型,函数原型的作用是告诉编译器有关函数的信息: 函数的名字 函数返回的数据类型 函数要接受的参数个数、参数类型和参数的顺序 编译器根据函数原型检查函数调用的正确性 函数原型的形式: 类型 函数名 ( 形式参数表 );,3.1.3 函数原型,函数声明中也可以不写形参名,而只写形参的类型。,例如:double volume ( double , double ) ;,函数原型是 声明语句,4.4.2 函数原型,#include double max( double, double ) ; / 函数原型 void main() double a, b, c, m1, m2 ; cout a b c ; m1 = max( a, b ) ; / 函数调用 m2 = max( m1, c ) ; cout y ) return x ; else return y ; ,使用函数原型,3.1.3 函数原型,4.4.1 函数原型,#include double max( double, double ) ; / 函数原型 void main() double a, b, c, m1, m2 ; cout a b c ; m1 = max( a, b ) ; / 函数调用 m2 = max( m1, c ) ; cout y ) return x ; else return y ; ,函数原型的参数表 不需要参数名,使用函数原型,3.1.3 函数原型,4.4.1 函数原型,#include double max( double, double ) ; / 函数原型 void main() double a, b, c, m1, m2 ; cout a b c ; m1 = max( a, b ) ; / 函数调用 m2 = max( m1, c ) ; cout y ) return x ; else return y ; ,函数调用出现在定义之前 函数原型声明是必须的,使用函数原型,3.1.3 函数原型,4.4.1 函数原型,函数定义在调用之前,#include double max( double x, double y ) / 函数定义 if ( x y ) return x ; else return y ; void main() double a, b, c, m1, m2 ; cout a b c ; m1 = max( a, b ) ; / 函数调用 m2 = max( m1, c ) ; cout “Maximum = “ m2 endl ; ,3.1.3 函数原型,4.4.2 函数原型,函数定义在调用之前,#include double max( double x, double y ) / 函数定义 if ( x y ) return x ; else return y ; void main() double a, b, c, m1, m2 ; cout a b c ; m1 = max( a, b ) ; / 函数调用 m2 = max( m1, c ) ; cout “Maximum = “ m2 endl ; ,3.1.3 函数原型,4.4.2 函数原型,math.h中几个常用的数学函数,3.1.3 函数原型,4.4.2 函数原型,/ 例3-3 用库函数求正弦和余弦值 #include #include void main() double PI = 3.1415926535; double x, y; x = PI/ 2; y = sin( x ); cout “sin( “ x “ ) = “ y endl ; y = cos( x ); cout “cos( “ x “ ) = “ y endl ; ,3.1.3 函数原型,4.4.2 函数原型,/ 例3-3 用库函数求正弦和余弦值 #include #include void main() double PI = 3.1415926535; double x, y; x = PI / 2; y = sin( x ); cout “sin( “ x “ ) = “ y endl ; y = cos( x ); cout “cos( “ x “ ) = “ y endl ; ,包含头文件,3.1.3 函数原型,4.4.2 函数原型,/ 例3-3 用库函数求正弦和余弦值 #include #include void main() double PI = 3.1415926535; double x, y; x = PI / 2; y = sin( x ); cout “sin( “ x “ ) = “ y endl ; y = cos( x ); cout “cos( “ x “ ) = “ y endl ; ,调用库函数,3.1.3 函数原型,C+有三种参数传递机制: 值传递 指针传递 引用传递,4.2 函数参数的传递,3.2 函数参数的传递,4.2.1 传值参数,调用函数时,实参表达式的值被复制到相应形参标识的对象中, 并按形参类型强制转换 函数内对形参的访问、修改,都在形参的标识对象进行 函数返回时,形参对象被撤消,不影响实参的值 值传送的实参可以是常量、有确定值的变量或表达式 函数返回值通过匿名对象传递,3.2.1 传值参数,1值传递机制,/ 例3-4 强制类型转换 # include void main ( ) float add1 ( float , float ) ; / 函数原型 float add2 ( int , int ) ; / 函数原型 float a , b, c ; cin a b ; c = add1 ( a , b ) ; cout “c1=“ c endl ; c = add2 ( 1/a , 1/b) ; cout “c2=“ c endl ; float add1 ( float x , float y ) return ( x + y ) ; float add2 ( int i , int j ) return ( i + j ) ; ,3.2.1 传值参数,/ 例3-4 强制类型转换 # include void main ( ) float add1 ( float , float ) ; / 函数原型 float add2 ( int , int ) ; / 函数原型 float a , b, c ; cin a b ; c = add1 ( a , b ) ; cout “c1=“ c endl ; c = add2 ( 1/a , 1/b) ; cout “c2=“ c endl ; float add1 ( float x , float y ) return ( x + y ) ; float add2 ( int i , int j ) return ( i + j ) ; ,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,int a, b, c ;,/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,cin a b;,/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,c = add(a,b) ;,/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,int add(int i, int j ),/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,2,4, i + + ; j + + ;,/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,i,j,2,4,return ( i + j ); ,/ 例3-5 值参传递,3 + 5,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,i,j,2,4,return ( i + j ); ,/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,i,j,8,2,4,c = add(a,b) ;,/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,8,c = add(a,b) ;,/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,#include int add(int , int ) ; void main() int a, b, c ; cin a b; c = add(a,b) ; cout “c = “ c endl ; int add(int i, int j ) i + + ; j + + ; return ( i + j ); ,8,输出,c = 8,cout “c = “ c endl ;,/ 例3-5 值参传递,1值传递机制,3.2.1 传值参数,2实际参数求值的副作用,C+没有规定在函数调用时实际参数的求值顺序 若实际参数表达式之间有求值关联,同一个程序在不同编译器可能 产生不同的运行结果,3.2.1 传值参数,2实际参数求值的副作用,#include int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout “ 5 + 11 = “ z “ ?!n“ ; ,从右向左计算实参表,x+y,3.2.1 传值参数,2实际参数求值的副作用,从右向左计算实参表,5,6,10,+ x,5,#include int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout “ 5 + 11 = “ z “ ?!n“ ; ,3.2.1 传值参数,2实际参数求值的副作用,#include int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout “ 5 + 11 = “ z “ ?!n“ ; ,从右向左计算实参表,5,x,y,10,5 + 10,3.2.1 传值参数,2实际参数求值的副作用,#include int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout “ 5 + 11 = “ z “ ?!n“ ; ,从右向左计算实参表,5,x,y,10,5 + 10,3.2.1 传值参数,2实际参数求值的副作用,#include int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout “ 5 + 11 = “ z “ ?!n“ ; ,从右向左计算实参表,5,x,y,10,15,3.2.1 传值参数,2实际参数求值的副作用,#include int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout “ 5 + 11 = “ z “ ?!n“ ; ,15,x,y,z,3.2.1 传值参数,2实际参数求值的副作用,#include int add ( int x , int y ) return x + y ; void main ( ) int x = 4 , y = 6 ; int z = add ( + x , x + y ) ; cout “ 5 + 11 = “ z “ ?!n“ ; ,修改程序,+ x ; int z = add ( x , x + y ) ; cout “ 5 + 11 = “ z “n“ ;,3.2.1 传值参数,3默认参数,C+允许指定传值参数的默认值。当函数调用中省略默认参数时, 默认值自动传递给被调用函数 默认参数在函数原型定义 默认参数放在一般参数之后,3.2.1 传值参数,/ 例3-7 使用默认参数 # include double power ( double real, int n = 2 ) ; void main ( ) double r = 3.0 ; cout power ( r ) endl ; cout power ( r, 3 ) endl ; double power ( double real , int n ) if ( n = 0 ) return 1.0 ; double result = real ; for ( int i = 2 ; i = n ; i + ) result *= real ; return result; ,3.2.1 传值参数,/ 例3-7 使用默认参数 # include double power ( double real, int n = 2 ) ; void main ( ) double r = 3.0 ; cout power ( r ) endl ; cout power ( r, 3 ) endl ; double power ( double real , int n ) if ( n = 0 ) return 1.0 ; double result = real ; for ( int i = 2 ; i = n ; i + ) result *= real ; return result; ,定义默认参数,3.2.1 传值参数,/ 例3-7 使用默认参数 # include double power ( double real, int n = 2 ) ; void main ( ) double r = 3.0 ; cout power ( r ) endl ; cout power ( r, 3 ) endl ; double power ( double real , int n ) if ( n = 0 ) return 1.0 ; double result = real ; for ( int i = 2 ; i = n ; i + ) result *= real ; return result; ,使用默认参数 power ( r,2 ),3.2.1 传值参数,/ 例3-7 使用默认参数 # include double power ( double real, int n = 2 ) ; void main ( ) double r = 3.0 ; cout power ( r ) endl ; cout power ( r, 3 ) endl ; double power ( double real , int n ) if ( n = 0 ) return 1.0 ; double result = real ; for ( int i = 2 ; i = n ; i + ) result *= real ; return result; ,不使用默认参数,3.2.1 传值参数,int f ( ) ; void delay ( int k , int time = f ( ) ) ;,void ferror1 ( int x , int y = 1 , int z ) ;,void ferror2 ( int x , int y = 0 ) ; void ferror2 ( int x ) ; ferror2 ( 3 ) ; / 调用哪个函数 ?,Error!,3默认参数,3.2.1 传值参数,4.3 函数调用机制,函数之间的关系,C+程序从主函数开始执行 主函数由操作系统调用,主函数可以调用其它函数 其它函数可以互相调用,但不能调用主函数 所有函数是平行的,不能嵌套定义,4.3 函数调用机制,函数之间的关系,主函数调用其它函数,其它函数互相调用,函数递归调用,4.3.1 嵌套调用,main(),调用fa(),堆 栈,fa(),调用fb(),fb(),操作系统运行状态,返回地址,main() 的参数,main () 运行状态,返回地址,fa () 的参数,fa () 运行状态,返回地址,fb () 的参数,3.3.1 嵌套调用,4.3.1 嵌套调用,main(),调用fa(),结束,fa(),调用fb(),fb(),操作系统运行状态,返回地址,main() 的参数,main () 运行状态,返回地址,fa () 的参数,fa () 运行状态,返回地址,fb () 的参数,堆 栈,3.3.1 嵌套调用,/例3-14 函数嵌套调用示例 #include long fact ( int m ) int i ; long sum = 1 ; for ( i = 1 ; i a b ; f1 = fact ( a ) / ( fact ( b ) * fact ( a-b ) ) ; cout “ first: bin(“ a , b “)= “ f1 endl ; f2 = bin ( a , b ) ; cout “ second: bin(“ a , b “)= “ f2 endl ; ,3.3.1 嵌套调用,/例3-14 函数嵌套调用示例 #include long fact ( int m ) int i ; long sum = 1 ; for ( i = 1 ; i a b ; f1 = fact ( a ) / ( fact ( b ) * fact ( a-b ) ) ; cout “ first: bin(“ a , b “)= “ f1 endl ; f2 = bin ( a , b ) ; cout “ second: bin(“ a , b “)= “ f2 endl ; ,3.3.1 嵌套调用,/例3-14 函数嵌套调用示例 #include long fact ( int m ) int i ; long sum = 1 ; for ( i = 1 ; i a b ; f1 = fact ( a ) / ( fact ( b ) * fact ( a-b ) ) ; cout “ first: bin(“ a , b “)= “ f1 endl ; f2 = bin ( a , b ) ; cout “ second: bin(“ a , b “)= “ f2 endl ; ,3.3.1 嵌套调用,/例3-14 函数嵌套调用示例 #include long fact ( int m ) int i ; long sum = 1 ; for ( i = 1 ; i a b ; f1 = fact ( a ) / ( fact ( b ) * fact ( a-b ) ) ; cout “ first: bin(“ a , b “)= “ f1 endl ; f2 = bin ( a , b ) ; cout “ second: bin(“ a , b “)= “ f2 endl ; ,3.3.1 嵌套调用,4.3.2 递归调用,递归函数要求, 递归形式(算法) 递归条件(缩小问题规模) 递归终止条件(基本情况),递归结构是更强的循环结构 所有的循环结构都可以写成递归结构,反之不一定行,递归函数 函数直接或间接调用自己,3.3.2 递归调用,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,例3-15 求阶乘,3.3.2 递归调用,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,递归形式,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,递归终止条件 基本情况,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,修改递归条件,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,k,3,F (3),n,3,F (3),3* F (2),n,2,F(2),2* F(1),n,1,F (0),1,计算 Factorial (3) = 3!,F(1),n,0,1* F(0),3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,k,3,F (3),n,3,F (3),3* F (2),n,2,F(2),2* F(1),n,1,F (0),1,计算 Factorial (3) = 3!,F(1),n,0,1* F(0),1,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,k,3,F (3),n,3,F (3),3* F (2),n,2,F(2),2* F(1),n,1,计算 Factorial (3) = 3!,F(1),3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,k,3,F (3),n,3,F (3),3* F (2),n,2,F(2),2* F(1),n,1,计算 Factorial (3) = 3!,F(1),F (1) = 1,1,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,k,3,F (3),n,3,F (3),3* F (2),n,2,F(2),计算 Factorial (3) = 3!,F(2) = 2,2,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,k,3,F (3),n,3,F (3),计算 Factorial (3) = 3!,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,k,3,F (3),n,3,F (3),计算 Factorial (3) = 3!,F(3) = 6,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n * Factorial ( n - 1 ) ; ,k,3,F (3),计算 Factorial (3) = 3!,3.3.2 递归调用,例3-15 求阶乘,int Factorial ( int n ) if ( n = = 0 ) return 1 ; else return n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论