主讲:相方莉
这堂课的整体安排!单击每个图标,可以进入相应的模块!
B 1. 在调用函数时,如果实参是简单变量,它与对应 形参之间的数据传递方式是( ) 地址传递 单向值传递 由实参传给形参,再由形参传回实参 1. 在调用函数时,如果实参是简单变量,它与对应 形参之间的数据传递方式是( ) 答 案 地址传递 单向值传递 由实参传给形参,再由形参传回实参 传递方式由用户指定 B 恭喜您!答对了! 通过自己制作的摇奖程序活跃课堂气氛! 单击单选按钮进行测试。 对不起!答错了! 对不起!答错了! 对不起!答错了!
A 2.以下函数值的类型是( ) fun(float x ) { float y; y=3*x-4; return y; } 答 案 A 恭喜您!答对了! int 不确定 void float 单击单选按钮进行测试。 对不起!答错了! 对不起!答错了! 对不起!答错了!
7 3. 设有以下函数,则输出结果是 f( int a) { int b=0; int c = 3; b++; c++; return(a+b+c); } main() { int a = 2, i; printf("%d\n",f(a)); } 7
函数的嵌套调用 函数的递归调用
§7.5 函数的嵌套调用 C语句不能嵌套定义函数,但可以嵌套调用函数. 也就是说在调用一个函数的过程中,又调用另一个函数。
eg:两层嵌套,其执行过程为: main 函数 a 函数 b函数 调用a函数 调用b函数 结 束
6 b(int x) { return(x+1);} a(int m, int n) {if(m>n) return(m); 想一想:输出结果是什么? b(int x) { return(x+1);} a(int m, int n) {if(m>n) return(m); else b(5);} main() { int m=3, n=8, r; r=a(m,n); printf("%d\n", r); } main 函数 调用a函数 a 函数 b函数 调用b函数 结 束 6
递归调用:在调用一个函数的过程中又出现直接 §7.6函数的递归调用 递归调用:在调用一个函数的过程中又出现直接 或间接的调用该函数本身的过程. 直接调用: int f(int x) {int y,z; z=f(y); return(2+z); } 间接调用: int f1(int x) int f2(int t) {int y,z; {int a,c; z=f2(y);} c=f1(a);}
有5个人坐在一起,问第五个人几岁?他说比第4个人大2岁。问第4个人,他说比第3个人大2岁。问第3个人,他说比第2个人大2岁。问第2个人,他说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人是多大。 求第5个人的年龄 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10 age(n)=10 (n=1) age(n)=age(n-1)+2 (n>1)
age(int n) {int c; if(n= =1) c=10; else c=age(n-1)+2; return(c); } main() { printf(“%d”,age(5)); } 运行结果: 18
age(5)=18 age(5)=age(4)+2 age(4)=16 =age(3)+2 age(3)=14 =age(2)+2 age(2)=12 =age(1)+2 =10
汉诺塔 汉诺塔是一种古老的数学问题,是指在“A”柱上从下向上依次放着从大到小的一叠盘子,要把该柱上的盘子全部搬到指定的 “C”柱,在搬运过程中,可以利用“B”柱来协助搬移,但每次只允许移动一个盘子,且在移动过程中始终保持大盘在下,小盘在上。试问怎样搬移盘子?最少需要搬几次才能把“A”柱上的全部盘子移至“C”柱? A B C
通过让学生上来玩游戏,在玩的过程中体会”汉诺塔”的算法!
void move(char x,char y) { printf(“%c- - >%c\n”,x,y); } main() {int m; printf(“input the number of diskes:”); scanf(“%d”,&m); printf(“the step to moving %3d diskes:\n”,m); hanoi(m,’A’,’B’,’C’); }
将n个盘从A座借助B座,移到C座 A B C void hanoi(int n,char A,char B,char C) 需要搬的盘子的个数 借助位置 起始位置 目的地 将n个盘从A座借助B座,移到C座 void hanoi(int n,char A,char B,char C) {if(n==1)move(A,C); A B C
将n个盘从A座借助B座,移到C座 A B C void hanoi(int n,char A,char B,char C) 需要搬的盘子的个数 借助位置 起始位置 目的地 将n个盘从A座借助B座,移到C座 void hanoi(int n,char A,char B,char C) {if(n==1)move(A,C); else{ hanoi(n-1,A,C,B); A B C
将n个盘从A座借助B座,移到C座 A B C void hanoi(int n,char A,char B,char C) 需要搬的盘子的个数 借助位置 起始位置 目的地 将n个盘从A座借助B座,移到C座 void hanoi(int n,char A,char B,char C) {if(n==1)move(A,C); else{ hanoi(n-1,A,C,B); A B C move(A,C);
将n个盘从A座借助B座,移到C座 A B C void hanoi(int n,char A,char B,char C) 需要搬的盘子的个数 借助位置 起始位置 目的地 将n个盘从A座借助B座,移到C座 void hanoi(int n,char A,char B,char C) {if(n==1)move(A,C); else{ hanoi(n-1,A,C,B); A B C move(A,C); hanoi(n-1,B,A,C); }
从例题中可以看到,有些问题,采用递归的方法解决,会变得非常简单,且源程序也很简洁。 一个问题要采用递归的方法解决时,要符合以下条件: 1、可以把一个问题转化为一个新问题,而新问题的解决方案仍与原问题相同,只是问题的规模不同。它们只是有规律的递增或递减。 2、可以通过转化过程使问题得到解决。 3、必须有一个明确的结束递归的条件。
1.函数的嵌套调用: 在调用一个函数的过程中,又调用另一个函数。 2.函数的递归调用: 在调用一个函数的过程中,又调用它本身。
设计制作:相方莉 部 门:计算机应用系 制作时间:2008年12月 欢迎提供宝贵意见! susanxfl@163.com