
程序设计基础(上) 张立红 13405330459(88028) QQ:2653453357 9#501
程序设计基础(上) 张立红 13405330459(88028) QQ:2653453357 9#501

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

7.3函数的嵌套与递归调用一P124 7.3.1函数的嵌套调用一P124 C规定:函数不能嵌套定义,但可以嵌套调用 main() a函数 b函数 ② ③ ④ 调用函数a 调用函数b ⑤ ⑨ ⑧ ① ⑤ main结束 函数嵌套调用的示意图 3
7.3 函数的嵌套与递归调用—P124 C规定:函数不能嵌套定义, 7.3.1 函数的嵌套调用—P124 但可以嵌套调用 main( ) 调用函数a main结束 a函数 b函数 调用函数b ——函数嵌套调用的示意图 3

【例75】已知组合数C:= m! m-n!' 对于任意m、n,求C的值。 ①#include ② double fac(intk)∥fac0函数求k阶 int main() ② @ int i; ③ intm,n; double ④ double t; for (i=1,f=1;i<=k;i++) ⑤ scanf("%d%d",&m,&n); ecmn(m,n);/调用求组合数的函数cmn0 ⑦ printf("C(%d,%d)=%lfn",m,n,t); ⑧ return 0; double drn(int m,int n) ⑨ double res, res=fac(m)/(fac(n)fac(m-n)); main() cmn函数 fac函数 return res 调用函数cmm了 调用函数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("C(%d,%d)=%lf\n",m,n,t); ⑧ return 0; ⑨ }

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

7.3.2函数的递归调用一P125 在调用一个函数的过程中直接或间接调用函数本身 ①int f(int x)/定义 称为函数的递归调用。 ② ① int y,z; ① int f1(int x) int f2(int t) ③ ② int int a,c; ④ (y)∥调用 ③ ⑤ =f2(y)9 4 c-f1(a); return (2*Z 5 ⑦ }∥函数f直接调用自己 return(2*Z☑; return③ Fc); 函数1间接调用自己)}f1() f2(0 调f 直接遂归 调2 调f1 6
6 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的阶乘n! 方法一:利用循环 f()片n!=1*2*3*.(n-1)*n,用循环语句来编写非递归函数f: ①long f(intn) ② long y=1; ③ int i; ④ for(i=1;i1时 ⑤ return y; ⑥
【例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; ⑥ }

例7.7:递归方法求nl= 1 n=0,1 ① #include Cn*n-1)! n>1 ② long t(intn)I递归函数定义 ① int main() ③ long y; ④ ② if(n=1)y=1; int n; ⑤ if(n>1)y=n*f(n-1); ③ scanf("%d",&n);输入:5 ⑥ ∥定义中调用自己 ④ printf("%ldin",f(n)); ⑦ return y; ⑤ returm0;输出:120 ⑧ ⑥ 8
8 例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) 最终转化为一个能立即求得结果的特殊问题 -递归边界