
第7章函数7.1函数概述7.2 上函数的定义和使用7.3 嵌套调用与递归调用变量与函数7.47.5随机数函数
第7章 函数 7.1 函数概述 7.2 函数的定义和使用 7.3 嵌套调用与递归调用 7.4 变量与函数 7.5 随机数函数

7.3-P124函数的嵌套与递归调用7.3.1函数的嵌套调用一P124C规定:函数不能嵌套定义,但可以嵌套调用main()a函数b函数D34调用函数a5调用函数b9?86main结束钢数嵌套调用的示就图2
7.3 函数的嵌套与递归调用—P124 C规定:函数不能嵌套定义, 7.3.1 函数的嵌套调用—P124 但可以嵌套调用 main( ) 调用函数a main结束 a函数 b函数 调用函数b ——函数嵌套调用的示意图 2

m!已知组合数C对于任意m、n,求C的值【例7.5] Ynl(m-n)!#include1int main()2doublefac(intk)llfac()函数求k阶2③3③intm,n;④5?inti;④double t;doublef;?for(i=1,f=1;K=k;i++)scanf("%d%d",&m,&n);S?f=f*i?tcmnm,n);1/调用求组合数的函数cmn(8retyrn7printf("%d%d%ifin",m,n,t)?return O;10doubledmn(itm,intn)9-??doubleres,13res=fac(m)/(fac(p)*fac(m-n))main(cmn函数fac函数14return res:人调用函数cmn调用函数fac输出结束
① #include ② double fac(int k) // fac()函数求k阶乘 ③ { ④ int i; ⑤ double f; ⑥ for (i=1,f=1;i<=k;i++) ⑦ f=f*i; ⑧ return(f); ⑨ } ⑩ double cmn(int m,int n) ⑪ { ⑫ double res; ⑬ res=fac(m)/(fac(n)*fac(m-n)); ⑭ return res; } main( ) 调用函数cmn 输出 结束 cmn函数 fac函数 调用函数fac ① int main() ② { ③ int m,n; ④ double t; ⑤ scanf("%d%d",&m,&n); ⑥ t=cmn(m,n); //调用求组合数的函数cmn() ⑦ printf("%d %d %lf\n",m,n,t); ⑧ return 0; ⑨ }

使用C语言函数注意:1)在C语言中,所有函数定义都是平行的----即在C程序中,函数不允许嵌套定义2)C语言允许函数嵌套调用:函数的嵌套调用是指一个函数在执行过程中调用一个函数(自已或其它函数),被调用函数在执行过程中文调用一个函数
使用C语言函数注意: 1)在C语言中,所有函数定义都是平行的 -即在C程序中,函数不允许嵌套定义。 2)C语言允许函数嵌套调用:函数的嵌套调用是指 一个函数在执行过程中调用一个函数(自己或其 它函数),被调用函数在执行过程中又调用一个 函数

7.3.2函数的递归调用一P125在调用一个函数的过程中直接或间接调用函数本身称为函数的递归调用。f(intx)//定义int71)1)int fl(int x)int f2(int t)inty,z ;② int a, c ;2 int3专营营3z-f(y);//调用00000544z-f2(y);c-f1(a);8088(2*z);return间接进归??//函数f直接调用自己66return(2*z);3Vo);return1函数f1间接调用自己f2(0)1f10一调f直接选归调f2调f15
5 7.3.2 函数的递归调用—P125 在调用一个函数的过程中直接或间接调用函数本身 ① int f(int x)//定义 -称为函数的递归调用。 ② { int y,z ; ③ . ④ z=f(y);//调用 ⑤ . ⑥ return (2*z); ⑦ }//函数 f 直接调用自己 ① int f1(int x) ② { int y,z ; ③ . ④ z=f2(y); ⑤ . ⑥ return(2*z); ⑦ } ① int f2(int t) ② { int a, c ; ③ . ④ c=f1(a); ⑤ . ⑥ return (3+c); 函数 f1 间接调用自己⑦ } f ( ) 调f 调f2 调f1 f1( ) f2( ) 直接递归 间接递归

例7.7用递归求n的阶价乘Ⅱ!方法一:利用循环f(n)=n!=1*2*3*....(n-1)*n,用循环语句来编写非递归函数ff(intn)long2 long y= l;int i;2for (i= 1;i1时n * (n - 1)!6return y;67
【例7.7】用递归求n的阶乘n! ① long f (int n) ② { long y = 1; ③ int i; ④ for (i = 1; i 1时 ① long f (int n) ② { long y; ③ if (n == 1) y=1; ④ else y = n * f (n-1); ⑤ return y; ⑥ }

n=0,17例7.7:递归方法求n!=n>1n*(n-1)!心#includelongf(intn)l/递归函数定义intmain()Klongy;2int n;if(n==1)y=1;③scanf("%d",&n);输入:55if(n>1)y=n*f(n-1);④6printf("%ldin".f(n));儿定义中调用自己?输出:120return y;return 0;8子?
7 例7.7:递归方法求 n!= 1 n=0,1 ① #include n*(n-1)! n>1 ② long f(int n) //递归函数定义 ③ { long y; ④ if (n==1) y=1; ⑤ if(n>1) y=n*f(n-1); ⑥ // 定义中调用自己 ⑦ return y; ⑧ } ① int main() ② { int n; ③ scanf("%d",&n); ④ printf("%ld\n",f(n)); ⑤ return 0; ⑥ } f(5) n=5 y=5*f(4) f(4) n=4 y=4*f(3) f(3) n=3 y=3*f(2) f(2) n=2 y=2*f(1) f(1) n=1 y=1 return y return y y=2 return y y=6 return y y=24 return y y=120 输出:120 输入:5

递归的基本思想:将复杂的操作分解为若干简单操作的多次重复。>说明C支持函数直接或间接调用自已。C编译系统对递归函数的自调用次数没有限制。每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出。递归一般可以代替循环语句
➢ 说明 ⚫C支持函数直接或间接调用自己。 ⚫C编译系统对递归函数的自调用次数没有限制。 ⚫ 每调用函数一次,在内存堆栈区分配空间,用 于存放函数变量、返回值等信息,所以递归次数 过多,可能引起堆栈溢出。 ⚫递归一般可以代替循环语句。 递归的基本思想:将复杂的操作分解为若干简单 操作的多次重复

递归注意:(1)一个递归程序中至少要有两个函数(main函数和递归函数)。(2)使用递归方法解决的问题,必须可以转化为与该问题类似但更简单的问题(3)最终转化为一个能立即求得结果的特殊问题-递归边界
递归注意: (1) 一个递归程序中至少要有两个函数(main函数和 递归函数)。 (2) 使用递归方法解决的问题,必须可以转化为与该 问题类似但更简单的问题。 (3) 最终转化为一个能立即求得结果的特殊问题 -递归边界

递归注意:递归时,注意数据可能溢出(4)#includeintf(int n)注意溢出int y;1.if (n==0 // n==1) y=1;if (n>1)Oy=f(n-1)*n;return y ;C:Users Administrator/Desktoplaalaalbin50人Cintmain()8Yint n;10scanf("%d",&n);printf("%din",f(n))return O;12
① #include ② int f(int n) ③ { int y; ④ if (n==0 | | n==1) y=1; ⑤ if (n>1) y=f(n-1)*n; ⑥ return y ; ⑦ } ⑧ int main() ⑨ { int n; ⑩ scanf("%d",&n); printf("%d\n",f(n)); ⑪ return 0; ⑫ } 注意溢出 递归注意: (4) 递归时,注意数据 可能溢出