递归
递归是什么?
递归是什么,递归就是一种解决问题的方法——程序自身调用自身叫做递归。它的核心在于:大事化小!!!
先举几个例子:
1.接受一个整型值,按顺序打印它的每一位。(只考虑正数)
如:1234 ----应输出1 2 3 4
(1)先讨论如果不递归该怎样处理,一般步骤是这样的,先判断这个数是几位数,然后在记录下这个数的每一位,最后输出。我们想想,首先判断这个数的位数的时候就得创建临时变量进行循环,而后再动态创建一个数组来记录这个数的每一位。
(2)但是递归的话就不用这样复杂了,我们要做的是要读取它的每一位,那这个函数的工作就只是读取它的每一位即可。只要注意递归的边界就行。
上代码:
void num(int n) {
if (n > 9) {
num(n / 10);
}
printf("%d ", n % 10);
}
就这短短几行就可以解决问题了。
2.不创建临时变量求字符串的长度
(1)还是先来看看创建临时变量是如何做到的:创建临时变量来记录字符串的长度,进入循环遍历该字符串。
(2)不创建临时变量时,我们可以考虑到递归。先看代码:
int lenth(const char* str){
if (*str == '\0') {
return 0;
}
return 1+lenth(str + 1);
}
分析:
①字符串的结束条件就是遇到'\0',这就是递归的边界。
②接下来只要考虑这个函数的目的是为了干嘛就行,该函数是为了求字符串长度,那么如果字符串没结束就返回当前所计算的字符串的长度加1就行。
3.求一个数的阶乘:num!
(1)非递归处理:一个循环,如果(num-1)不等于0,就num=num*(num-1),只是表达思想即可,但在这里不推荐这种直接再原变量上直接进行操作的方法。
(2)递归:先上代码:
int fac(int num) {
if (num == 1) {
return 1;
}
return num * fac(num - 1);
}
分析:
①同样递归的边界先搞清楚:当是1的时候就跳出。
②接下来只考虑该函数的功能即可,只要不是1,就返回num*(num-1)!,这样就明晰了很多。
总结:
1.递归的核心思想就是大事化小。
2.先考虑递归的边界,要确保递归能跳出,不然就会进入死循环。(一定会用if语句来进行分支,或者说判定是否要结束递归)
3.不要细想递归的内容,只想该函数的功能即可。