1、函数的嵌套调用,P167,函数定义是相互平行的,独立的,即函数不可嵌套定义(在一个函数体内不可定义另一个函数),但函数可以嵌套调用(在调用一个函数的过程中又调用另一个函数)。,例 : 阅读下列程序,写出其执行结果。,#include func1(int a , int b) int c; a+=a; b+=b; c=func2(a,b); return(c*c); func2(int a,int b) int c; c=a*b%3; return(c); ,void main() int x=7,y=17; printf(%dn,func1(x,y); ,4,main(),func1(x,y),func1,a=7 b=17,func2(a,b),func2,a=14 b=34,a= 14,b= 34,c= 2,return(c),c= 2,return(c*c),结束,x=7 y=17,定义:在调用一个函数的过程中,出现直接或间接调用该函数本身。,直接调用:在调用f 函数的过程中,又要调用f函数自身。,main 函数,调用f函数,f函数,间接调用:在调用f1函数的过程中要调用f2函数,
2、而在调用f2函数的过程中又要调用f1函数。,main 函数,f1函数,调用f2函数,f2函数,调用f1函数,P171,函数的递归调用,P171,一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决.,递归分为两个阶段: 递归前进段(递推):把复杂问题的求解推到比原问题简单一些的问题的求解; 递归返回段(回归):当获得最简单的解后,逐步返回,依次得到复杂的解。 使用递归时,必须有一个明确的递归结束条件,称为递归出口。当条件不满足时,递归前进;当条件满足时,递归返回。 因此,在考虑使用递归算法编写程序时,应满足两点: 1、该问题能够被递归形式描述; 2、是否存在递归结束的条件。,递 归,P172 例8.7 有5 个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人多少岁?他说比第3个人大2岁。问第3个人多少岁?他说比第2个人大2岁。问第2个人多少岁?他说比第1个人大2岁。最后问第一个人,他说是10岁。请问第5个人多大?,f(n)=f(n-1)+2 n1 f(1)=10 n=1,void main() int n
3、=5; printf(age(%d)=%dn,n,fun(n); ,int fun(int n) if(n=1) return 10; else return fun(n-1)+2; ,#include int fun(int n) int m ; if(n=1) m =10; else m =fun(n-1)+2; return m; ,例:下列程序计算 请填空。,int sum(int n) if(n=1) _; else _ ; void main() int n; scanf(%d, ,return 1,return sum(n-1)+n,sum(n),#include long fun(int n) long f; if(n0) printf(n0,data error); exit(0); else if(n=0|n=1) f=1; else f=fun(n-1)*n; return(f); void main ( ) int n;long y; scanf(%d,P173.例8.8 用递归的方法求n!,main,fun(4),n=4,f=1,f=1*2,f=2*3,f=6
4、*4,fun(n),y=24, if(n0) printf(n0,data error); exit(0); if(n=0|n=1) return 1; return fun(n-1)*n; ,#include void main (void) int i=5; printf(“%d”,sub(i); ,int sub (int n ) int a; if (n= =1) return 1; a=n+sub(n-1); return a; ,sub (5),n=5,a=5+sub (4),sub (4),n=4,a=4+sub (3),sub (3),n=3,a=3+sub (2),sub (2),n=2,a=2+sub (1),sub (1),n=1,return 1,return a,a=3,return a,a=6,return a,a=10,return a,a=15,算法相同,层层调用,每层函数的变量所占内存单元不同。,#include int fib(int n) if(n=0) return 0; else if(n=1) return 1; else if(n1) re
5、turn fib(n-1)+fib(n-2); void main() int i,n; scanf(%d, ,阅读下列程序,写出其函数的功能。,P202.8.13.用递归方法求n阶勒让德多项式的值,递归公式为:,#include stdio.h double P(double x, int n) if(n=0) return 1; if(n=1) return x; if(n1) return (2*n-1)*x-P(x,n-1)-(n-1)*P(x,n-2)/n; void main() double x; int n; double P(double x, int n); scanf(%lf%d,#include void main() int fun(); printf(n%dn,fun(567); ,例:下列程序输出结果为:,567 1,int fun(int n) if(n10) fun(n/10); printf(%d,n%10); return(1); ,main,fun(567),fun(),n=567,n10,fun(567/10),fun(),n=56,n10,f
6、un(56/10),fun(),n=5,n10,Y,Y,N,printf(%d,n%10);,return(1);,printf(%d,n%10);,return(1);,printf(%d,n%10);,return(1);,变量的属性 数据类型(操作属性) 变量所持有的数据的性质 存储属性(在内存中存储方式) 存储器类型:寄存器、静态存储区、动态存储区 生存期:变量在某一时刻存在-静态变量与动态变量 作用域:变量在某区域内有效-局部变量与全局变量,变量是对程序中数据的存储空间的抽象。,P188,变量概述,变量定义格式: 存储类型 数据类型 变量表;,变量的存储类型 auto -自动型 register-寄存器型 static -静态型 extern -外部型,如: int sum; auto int a,b,c; register int i; static float x,y; extern int j;,变量是对程序中数据的存储空间的抽象。,变量概述,变量定义格式: 存储类型 数据类型 变量表;,局部变量内部变量 定义:在函数模块内定义的,且只在本函数模块内有效。 说明: 1、
7、main中定义的变量只在main中有效 2、不同函数中同名变量,占不同内存单元 3、形参属于局部变量 4、在复合语句中定义的有效变量 5、局部变量可用存储类型: auto register static (默认为auto),P184,#include void main() int a=1,b=2,c=3; +a; c+=+b; int b=4,c; c=b*3; a+=c; printf(first:%d,%d,%dn,a,b,c); b+=a+c; printf(second:%d,%d,%dn,a,b,c); printf(third:%d,%d,%dn,a,b,c);,1 2 3,1 2 3 4 5,2,3 6,12,14,14,4,12,30,14,30,12,14,3,6,写出下列程序的运行结果,在复合语句中可以重新对变量进行数据类型的定义。,复合语句,first:14,4,12 second:14,30,12 third:14,3,6,#include void main() int i=1,j=3; printf(%d,i+); int i=0; i+=j*2; pri
8、ntf(%d,%d,i,j); printf(%d,%dn,i,j); ,复合语句,int i=0;,1,6,3,2,3,写出下列程序的运行结果,全局变量-外部变量 定义:在函数外定义,可为本文件所有函数共用 变量的作用域(有效范围):从定义变量的位置开始到本源文件结束为止。,全局变量的作用域的特点: 在全局变量与局部变量不同名时,其作用域是整个程序。 在全局变量和局部变量同名时,在同名局部变量的作用域内,全局变量不起作用。 全局变量存放在静态存储区。,P185,#include int a=3,b=6; void main() int c; c=+a+b+; func(c); printf(a=%d,b=%dn,a,b); func(int a) b=a%b; printf(a=%d,b=%dn,a,b); ,当外部变量与局部变量同名,则在局部变量的作用域内,外部变量不起作用。,全局变量的定义,局部变量,a=10,b=3 a=4,b=3,int m=13; int fun(int x,int y) int m=3; return(x*y-m); void main() int a=7
9、,b=5; printf(%dn,fun(a,b)/m); ,全局变量,局部变量,2,1,写出下列程序的运行结果,int p=1,q=5; float f1(int a) int b,c; . int f3() . char c1,c2; char f2(int x,int y) int i,j; main() int m,n; . ,c1,c2的作用范围,p,q的作用范围,extern char c1,c2;,extern char c1,c2;,若外部变量与局部变量同名,局部变量优先。,外部变量说明(P209): extern 数据类型 变量表;, 对静态存储变量,若定义时赋初值,则程序运行中仅在第一次调用时赋初值,下一次调用不再赋初值,而是使用上一次调用的值(即只赋一次值)。, 对静态存储变量,若定义时不赋初值,则系统自动赋0,而动态变量不赋初值则值不确定。,#include void main() int a=2,j; for(j=0;j3;j+) printf (%d,f(a); int f(int a) int b=0; static int c=0; b+;+c; return(a+b+c); ,读下列程序,写出其运行结果:,4,static int c=0;,a j,2,for,0,j3,a b,2,0,0,1,1,4,1,2,0,1,2,5,2,2,0,1,3,6,3,5,6,456,有以下程序,程序运行后的输出结果是 #include int c=-2; main() int j; for(j=0;j=1;j+) fun(j,c); printf(c=%dn,c); fun(int a
《C语言-11-函数的调用 PPT课件》由会员Lesl****ang分享,可在线阅读,更多相关《C语言-11-函数的调用 PPT课件》请在金锄头文库上搜索。