函数嵌套调用
嵌套调用:在被调函数内有去主动去调用其他函数;
案例1
需求:输入四个整数,找出其中最大的数,用函数嵌套来处理,要求每次只能两个数比较
// 函数声明
int max_2(int,int);
int max_4(int,int,int,int);
// 主函数
int main()
{
int a=12,b=44,c=33,d=16,result;
result = max_4(12,44,33,16);
printf("%d,%d,%d,%d中的最大数是%d\n",a,b,c,d,result);
return 0;
}
// 求2个数中的最大数
int max_2(int a,int b)
{
return a > b ? a : b;
}
// 求4个数中的最大数
int max_4(int a,int b,int c,int d)
{
int max;// 存储比较的最大数
max = max_2(a,b);// 第一次比较:a,b中最大数
max = max_2(max,c);// 第二次比较:a,b,c中最大数
max = max_2(max,d);// 第三次比较:a,b,c,d中最大数
return max;
}
经典(递归)
简言之就是直接间接调用自己(本质:构成循环结构——死循环
),一般用于阶乘(从后往前思考,与for
相反)、幂运算、字符串翻转
void f()
{
f(); //调用自己,但是也会退出,因为调用需要分配栈空间,直到栈空间不足
}
//阶乘
int jiecheng(int n)
{
if(n == 1)
return 1; //结束条件
return jiecheng(n-1) * n;
}
int main()
{
int m = jiecheng(3);
printf("%d\n",m);
return 0;
}
//幂运算 a^n = a^(n-1) * a
注意事项:
1.递归必须要有出口来终止递归;
2.终止条件的判断一定要在函数递归之前;
3.函数递归的同时要将将函数调用向出口逼近;
第一个人10岁,后面每一个人比前一个大两岁,问第五个
int age(int n);
int main()
{
int n, c = 0;
scanf("%d", &n);
c = age(n);
printf("%d\n",c);
return 0;
}
int age(int n)
{
int c;
if(n == 1)
{
c = 10;
}else if(n > 1)
{
c = age(n -1) + 2;
}
return c;
}
数组作为函数参数
注意:
当数组为实参时,形参也要用对应数组/指针接收。特别注意,此次传递仅仅是传递数组首地址(而不是整个数组),实参和形参共用一个内存,形参会改变实参。这叫引用传递
当数组为形参时,我们需要额外提供数组元素个数。这样就可以依据长度来构建一个和实参一样的数组,防止访问越界。
特别的:字符数组为形参时,且字符数组存放着字符串(形参是字符数组,实参是字符串)。不需要表示长度的形参,因为字符串自带结束符\0
。
案例1
判断两个数组的大小,逐个比较,大的多为大
static int compare(int x, int y);
int main()
{
int a[10], b[10];
int max,min,k;
printf("请输入十个数:\n");
for(int i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
for(int i = 0; i < 10; i++)
{
scanf("%d", &b[i]);
}
for(int i = 0; i < 10; i++)
{
if(compare(a[i],b[i]) == 1)
{
max++;
}else if(compare(a[i],b[i]) == 0)
{
k++;
}else if(compare(a[i],b[i]) == -1)
{
min++;
}
}
printf("a数组大于b数组有%d个,小于%d个,等于%d个。",max,min,k);
return 0;
}
static int compare(int x, int y)
{
int flag = 0;
if(x > y)
{
flag = 1;
}else if(x == y)
{
flag = 0;
}else{
flag = -1;
}
return flag;
}
案例2
求两个不同大小的数组的平均值
static double average(float a[], int len);
int main()
{
double avg = 0.0;
float a[5] = {1,2,3,4,5};
float b[10] = {1,2,3,4,5,6,7,8,9,10};
printf("a班平均数%lf\n",avg = average(a,sizeof(a) / sizeof(a[0])));
printf("b班平均数%lf\n",avg = average(b,sizeof(b) / sizeof(b[0])));
return 0;
}
static double average(float a[], int len)
{
double avg = 0.0;
float sum = 0.0;
for(int i = 0; i < len; i++)
{
sum += a[i];
}
avg = sum / len;
return avg;
}