(一)嵌套调用和链式访问
1.函数是不可以嵌套定义的,但是可以嵌套调用。
2.链式访问:就是将一个函数的返回值作为另一个函数的参数。如下:
#include<stdio.h>
int main()
{
int t = strlen("abc");//使用strlen函数算出字符串的长度将其赋值给t
printf("%d\n",t);
printf("%d\n,strlen("abc")); //此时strlen函数的返回值为3,也就是printf函数的参数
return 0;
}
思考:printf(“%d”,printf(“%d”,printf(“%d”,43)));会打印出什么呢?
那么为什么会打印出4321呢?
原因是printf函数的返回值是打印在屏幕上的字符的个数。所以上述代码所描述的意思就是,首先最里面的printf函数打印出43,两个字符所以返回值为2;第二个printf函数就会打印出2,一个字符,所以返回值为1;最外层的printf函数就会打印1。
(二)函数递归
1.含义:指一个函数在其定义的时候直接或间接调用自身的方法。
2.思考策略:“大事化小”。
举一个例子(在程序中基本不用,是错误的,但可以很好的说明递归)代码如下:
int main()
{
printf("%d\n",123456789);
main(); //这就是在自己的函数中调用自己
return 0;
}
上述代码的运行结果就是一直打印123456789。
练习一:输入无符号1234,依次打印1,2,3,4
步骤一:先使用大事化小的思路来分析如何使用函数递归。如下图
也就是1234,第一次调用后剩余123,第二次调用后剩余12,在调用最后剩1并且跳出调用。
步骤二:编写执行体函数
1.要实现1234变为123再变为12最后成1,容易想到需要使用 1234/10 和 1234%10 来实现。
代码如下:
#include<windows.h> //此处使用Sleep函数需要引用改头文件
void print(unsigned int n)
{
if (n > 9) //当这个数是两位数的时候才进入一下语句
{
print(n / 10); //递归
}
printf("%d", n % 10); //只剩1的时候打印出来
Sleep(1000); //使用该函数方便看清楚是如何依次打印出来的
}
int main()
{
int n = 1234;
int m = 0;
print(n);
}
相信这样直接写出代码是很难理解的,所以请看下图
根据上图可知,递归可以分为两个阶段:递和归
第一个阶段:逐层调用print函数。当n=1234进入print函数之后会再一次以n=123进入一次print函数,之后又以n=12进入一次print函数,最后n=1进入一次print函数。
第二个阶段:逐层跳出if语句,执行后面的语句。也就是n=1时不满足if语句所以不再进入print函数,直接执行1%10打印出1;再到n=12,调用print函数之后打印出1后执行12%10打印出2;同理依次往上打印出3;再打印出4。