第11节 函数的调用
1.函数的嵌套调用
►在调用一个函数的过程中,又调用另一个函数,称为函数的嵌套调用,C++允许函数多层嵌套调用,只要在函数调
用前有函数声明即可。
【例11.1】函数的嵌套调用举例。
1 #include <iostream>
2 using namespace std;
3 int fa(int a,int b); //fa函数原型
4 int fb(int x); //fb函数原型
5 int main()
6 {
7 int a=5,b=10,c;
8 c = fa(a,b); cout<<c<<endl;
9 c = fb(a+b); cout<<c<<endl;
10 return 0;
11 }
12 int fa(int a,int b)
13 {
14 int z;
15 z= fb(a*b);
16 return z;
17 }
18 int fb(int x)
19 {
20 int a=15,b=20,c;
21 c=a+b+x;
22 return c;
23 }
图11.1 嵌套调用示意
1 #include <iostream>
2 #include <cmath>
3 using namespace std;
4 double f(double x)
5 { //所要求解的函数公式,可改为其他公式
6 return x*x*x-3*x-1;
7 }
8 double point(double a,double b)
9 { //求解弦与x轴的交点
10 return (a*f(b)-b*f(a))/(f(b)-f(a));
11 }
12 double root(double a, double b)
13 { //弦截法求方程[a,b]区间的根
14 double x,y,y1;
15 y1=f(a);
16 do {
17 x=point(a,b); //求交点x坐标
18 y=f(x);//求y
19 if (y*y1>0) y1=y, a=x;
20 else b=x;
21 } while (fabs(y)>=0.00001); //计算精度E
22 return x;
23 }
24 int main()
25 {
26 double a,b;
27 cin>>a>>b;
28 cout<<"root="<<root(a,b)<<endl;
29 return 0;
30 }
2.函数的递归调用
►函数直接或间接调用自己称为递归调用。C++语言允许函数递归调用,如图(a)所示为直接递归调用,如图(b)
所示为间接递归调用。
【例11.3】使用函数的递归求n的阶乘的函数。
1 #include <iostream>
2 using namespace std;
3 int f(int n)
4 {
5 if (n>1) return f(n-1)*n; //递归调用
6 return 1;
7 }
8 int main()
9 {
10 cout<<f(5)<<endl;
11 return 0;
12 }
【例11.4】Hanoi塔问题。设有A、B、C三个塔座,在塔座A上有n个圆盘,这些圆盘自上而下由小到大的叠在一起。
现在要将塔座A上的这叠盘子移到塔座C上,并仍按同样顺序放置,且在移动的过程中遵循规则:
①每次只能移动一个圆盘;②不能将较大的圆盘压在较小的圆盘之上;③移动中可以使用A、B、C任一塔座。
void Hanoi(int n, char A, char B, char C)
{
if (n==1) cout<<A<<"->"<<C<<" ";
else {
Hanoi(n-1, A, C, B);
cout<<A<<"->"<<C<<" ";
Hanoi(n-1, B, A, C);
}
}
int main(void)
{
……
Hanoi(n, 'A', 'B', 'C');
……
}
/*运行结果:
3 + 回车键
A->C A->B C->B A->C B->A B->C A->C
*/