(此文章接续上一篇《魔术师般的 函数》)
首先补充一下void相关内容:
void game(void)
{printf("master");
}
第一个void意味着不需要返回值,第二个void代表没有任何参数;
当不写第一个void时大多数是默认int 但是有例外,所以不要这么做;
目录:(4)函数的嵌套调用和链式访问 (5)函数的声明和定义 (6)函数的递归
(4)函数的嵌套调用和链式访问
part1: 函数的嵌套调用是指函数里面可以再放函数(本身函数或者其他函数都行)
例如:主函数main(){内加函数}
但是注意 函数内部不可以再定义函数(这也就是为什么主函数里面不写函数而是函数写到外面)
无论是主函数内,或者子函数内都一样;
part2: 链式访问是把一个函数的返回值作为另外一个函数的参数
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
//结果是啥?
//注:printf函数的返回值是打印在屏幕上字符的个数
return 0;
}
打印结果是43 2 1
再例如:
库函数内套库函数;
(5)函数的声明和定义
part1函数的声明:就是说出函数的类型,名称和参数(不必写函数结构体);
part2函数的定义:就是函数结构体的书写;
例子:情况一:当子函数在主函数下面时:(没有函数声明时会出现提示,为了避免如此,下面是标准格式)
情况二:子函数在主函数上面时:(就是定义和声明放在一起,方便推荐)
void print(int n)
{
if(n>9)
{
print(n/10);
}
printf("%d ", n%10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
拓展:正常的一个工程,一般不把函数和主函数放在一起
而是在另一个源文件里面写函数结构体,
然后在头文件里面来写声明,
而在主函数内使用自定义函数,但是要引用头文件(也就是你头文件里的内容)#define(函数名)
(6)函数的递归(我愿称之为最强的套娃)
part1:定义;程序调用自身的编程技巧称为递归;
part2:作用:它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,
只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
把大事化小
part3:条件:存在限制条件,当满足这个限制条件的时候,递归便不再继续。 每次递归调用之后越 来越接近这个限制条件。
例子:接受一个整型值(无符号),按照顺序打印它的每一位。
例: 输入:1234,输出 1 2 3 4.
#include <stdio.h>
void print(int n)
{
if(n>9)
{
print(n/10);
}
printf("%d ", n%10);
}
int main()
{
int num = 1234;
print(num);
return 0;
}
分析:输入1234,进行自定义函数,
在自定义函数中,在一直满足n>9的条件下一直/10一直进入新的print,当不满足if时,剩余1,所以1%10=1,打印1, 然后开始向上一层推进,执行 printf("%d ", n%10);此时剩下12,然后打印2,然后再依次推到上一层,直到最后结束。
用图来表示就是
自我练习:求n!
对于递归不太好理解,画图就好理解了,然后就是递归掌握的最好方法就是练习递归。
好啦这就是今天的内容,谢谢大家观看,期待大家的指导,谢谢 !