1.函数不能嵌套定义,但可以嵌套使用
2.函数要先声明、再使用;函数的声明只需要指出函数的返回类型,函数名,函数的参数类型即可
eg:
int main()
{
int add(int, int); //函数声明
printf("%d \n", add(3, 4));
return 0;
}
int add(int a, int b)//加法函数
{
return a + b;
}
3.函数的声明一般在头文件(.h)文件中,而函数的具体实现一般在(.c)文件中
4.关于函数的参数调用:
a.传值调用:一般在不需要改变原有变量值时使用
b.传址调用:在需要对原有变量的值时使用,此时对函数形参传过去的应该是变量的地址
5.函数递归:思想:大事化小。
写递归代码时应注意:①不能死递归,要有跳出条件,每次递归要能不断逼近这个跳出条件
②递归层次不能太深(太深可能会导致栈溢出)
递归练习:
//eg1:不额外定义变量,打印出字符串的长度
int my_strlen(char* p)
{
if (*p != '\0')
{
return 1 + my_strlen(p + 1);
}
return 0;
}
int main()
{
char s[] = "bitsagdja";
printf("%d \n", my_strlen(s));
return 0;
}
//eg2:求n阶乘
int Fac(int n)
{
if (n > 1)
{
return n * Fac(n - 1);
}
else
{
return 1;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fac(n);
printf("%d \n", ret);
return 0;
}
//eg3:求第n个斐波那契数
int Fib(int n) //递归实现:数值较大时效率低下
{
if (n <= 2)
{
return 1;
}
else
{
return Fib(n - 1) + Fib(n - 2);
}
}
int Fib(int n) //循环迭代实现:在数值较大时效率占优
{
int a = 1;
int b = 1;
int c = 1;
while (n > 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fib(n);
printf("%d\n", ret);
return 0;
}