Stack Overflow - Where Developers Learn, Share, & Build Careers 秩序员的知乎网站
函数的嵌套调用和链式访问 嵌套调用函数和函数之间可以有机的组合的
void test3()//嵌套调用 把test3调用在test2函数里去
{
printf("hh");
}
void test2()//在test2调用在main函数里去
{
test 3();
return 0;
}
int main()
{
test2;
return 0;
}
链式访问
把一个函数的返回值作为另一个函数的参数
int main()
{
int len = strlen("abc");
printf("%dn", len);
//链式访问
printf("%dn",strlen("abc"));//strlen函数的返回值做了printf函数的参数
return 0;
}
//经典练习
int main()
{
printf("%d",printf("%d",printf("%d",43)));
return 0;
//那么打印的值是几呢
}
函数的声明和定义
1.函数的声明:一般出现在函数的使用之前。要满足先声明后使用
2.函数的声明:一般要放在头文件中的
3.函数的定义:是指函数的具体实现,交代函数的实现功能
int main()
{
int a = 10;
int b = 20;
int c = add(a, b);
//函数的声明
int add(int,int);
printf("%dn", c);
return 0;
}
int add(int x, int y)//函数的定义
{
return x + y;
}
函数的递归
什么是递归呢?
函数自己调用自己,递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。递归的主要思考方式在于:把大事化小
递归的两个必要条件1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越近这个限制条件。
写递归的注意事项1.不能死递归,都有跳出条件,每次递归都逼近跳出条件
2.递归层次不能太深,会出现栈溢出(栈溢出就是像水桶里一直加水,却不放水,导致内存的栈区满了)
练习题(进阶理解)//这是个错误的递归 但是是递归
int main()//main函数自己调用自己
{
printf("hh");
main();
return 0;
}
//进阶理解 接受一个整型值(无符号),按照顺序打印它的每一位.例如:输入1234输出 1 2 3 4
void print(unsigned int x)//unsigned是无符号的意思
{
if (x > 10)
print(x / 10);
printf("%dn", x % 10);
}
int main()
{
unsigned int a = 0;
scanf("%u", &a);
//递归 - 函数自己调用自己
print(a);//print函数可以打印参数部分数字的每一位
return 0;//递归 既要递,也要归
}
//进阶练习2 编写函数不允许创建临时变量,求字符串长度
int my_strlen(char* str)
{
if (*str != ' ')
{
return 1 + my_strlen(str + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "xgy";
//模拟实现一个strlen函数
printf("%dn",my_strlen(arr));
return 0;
}
递归与迭代
迭代:循环也是一种迭代
//练习1 求x的阶乘
int Fac(int x)
{
if (x <= 1)
{
return 1;
}
else
return x* Fac(x - 1);
}
int main()
{
int a = 0;
scanf("%d", &a);
int ret = Fac(a);
printf("%dn", ret);
return 0;
}
//练习2 求第n个斐波那契数 递归法(效率低)
int count = 0;
//递归可以求解,但是效率太低
int Fib(int x)
{
//统计第3个斐波那契数的计算次数
if (3 == x)
{
count++;
}
if (x <= 2)
{
return 1;
}
else
return Fib(x - 1) + Fib(x - 2);
}
int main()
{
int a = 0;
scanf("%d ", &a );
int ret = Fib(a);
printf("%dn", ret);
printf("conunt = %dn", count);
return 0;
}
//练习2 求第n个斐波那契数 迭代法(效率高)
int Fib(int n)
{
int x = 1;
int y = 1;
int z = 1;
while (n>2)
{
z = x + y;
x = y;
y = z;
n--;
}
return z;
}
int main()
{
int a = 0;
scanf("%d ", &a );
int ret = Fib(a);
printf("%dn", ret);
return 0;
}
函数递归的经典问题
1.汉诺塔问题
2.青蛙跳台阶问题(斐波那契数问题)


![[C语言(10)] 函 数递 归 [C语言(10)] 函 数递 归](http://www.mshxw.com/aiimages/31/1022199.png)
