函数(2)
目录
6.函数的声明和定义
6.1函数声明
6.2函数定义
7.函数递归
7.1什么是递归
7.2递归的两个必要条件
6.函数的声明和定义
6.1函数声明
1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么
例:int Add(int x, int y);
函数名:Add
参数:x,y(参数的类型是int)
返回类型:int
2.函数的声明一般出现在函数的使用之前,要满足先声明后使用
6.2函数定义
函数的定义是指函数的具体实现,交代函数的功能实现
举个栗子:使用函数实现加法操作
#define _CRT_SECURE_NO_WARNINGS#includeint Add(int x, int y);//函数声明int main(){int a = 5;int b = 10;int sum = Add(a, b);//函数调用printf("%d\n", sum);return 0;}//函数定义int Add(int x, int y){return x + y;//函数内容}
7.函数递归
7.1什么是递归
函数调用自身的编程技巧称为递归
使用条件:一个过程或一个函数在其定义或说明中有直接或间接调用自身的
实现方法:把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,只需要少量的程序就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量
核心思想:大事化小
7.2递归的两个必要条件
- 存在限制条件,当满足这个限制条件的时候,递归便不再继续
- 每次递归调用之后越来越接近这个限制条件
练习题1:接受一个整型值(无符号),按照顺序打印它的每一位
例:输入:1234 输出:1 2 3 4
思路1:使用数组
通过取余操作可以得到这个整数的最低位,采用循环的方式,将这个整数的每一位存储在一个整形数组中,再逆序打印这个数组,即可实现题目要求
代码如下:
#define _CRT_SECURE_NO_WARNINGS#includeint main(){int n = 1234;int arr[10] = { 0 };int i = 0;int j = 0; //把1234存入数组中for (i = 0; i = 0; j--){printf("%d ", arr[j]);}return 0;}
运行结果:
思路2:使用递归
打印1234的每一位,我们通过取余操作(1234%10)可以得到最后一位4,打印出来
这样我们只需要打印123的每一位,同样,通过取余操作(123%10)得到3打印出来
接着只需要打印12的每一位,取余(12%10)得到2打印出来
最后剩1打印
我们构造一个函数print,把num的每一位打印出来
print(1234) //打印1234的每一位
print(123) 4 //打印123的每一位和4
print(12) 3 4 //打印12的每一位和3和4
print(1) 2 3 4 //打印1的每一位和2和3和4
代码如下 :
#define _CRT_SECURE_NO_WARNINGS#include//print函数的返回值为空,参数为int类型void print(int n){ //当只剩一位数的时候,不需要再进行递归,直接打印即可if (n > 9){ //每次递归的参数为去掉最后一位的数print(n / 10);} //打印最后一位数printf("%d ", n % 10);}int main(){unsigned int num = 0;scanf("%d", &num);print(num);//调用函数return 0;}
运行结果:
递归的具体步骤如下图所示:
练习题2:编写函数,不允许创建临时变量,求字符串长度:
题目分析:我们先编写函数,求字符串长度,不看题目中不允许创建临时变量的要求
在这段代码中,我们创建了一个全局变量count,用来计数
当不允许创建临时变量时,我们就要换一种方法解决问题
对字符串"abcd":求它的长度
先判断第一个字符是否为0:
如果为0,则返回字符串的长度为0;
如果不为0,则该字符串的长度为1+“bcd”的长度
判断第二个字符是否为0:
不为0,则该字符串的长度为1+1+“cd”的长度
判断第三个字符是否为0:
不为0,则该字符串的长度为1+1+1+“d”的长度
判断第四个字符是否为0:
不为0,则该字符串的长度为1+1+1+1+“\0”的长度
判断第五个字符是否为0:
第五个字符为0,所以该字符串的长度为1+1+1+1=4
综上所述:采取递归的方式求解
代码如下:
#define _CRT_SECURE_NO_WARNINGS#includeint my_strlen(char* arr){if (*arr != 0){return 1 + my_strlen(arr + 1);}else{return 0;}}int main(){char arr[] = "abcdef";int length = my_strlen(arr);printf("%d\n", length);return 0;}
运行结果如下:
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖