递归概念
递归是一种在函数定义中使用函数自身的编程技术。在递归过程中,函数将问题分解为规模较小的子问题,并通过调用自身来解决这些子问题。递归通常用于解决可以被拆分成相似子问题的问题。
递归包含两个关键部分:
-
基本情况(Base Case): 定义了递归的终止条件。当函数达到基本情况时,不再继续递归调用,而是返回一个直接的结果。
-
递归步骤(Recursive Step): 定义了将问题分解为更小规模的子问题的方法,并通过递归调用自身来解决这些子问题。
递归的例子包括阶乘计算、斐波那契数列、二叉树的遍历等。在使用递归时,需要小心处理基本情况,以防止出现无限递归的情况。
举例代码
#include <stdio.h>
#include <string.h>
int len;
// 递归函数,输出字符串每个字符及递归层次信息
void digui(char shuzu[], int x) {
// 基本情况:当达到字符串末尾时终止递归
if (x == len) {
return;
}
printf("进入递归第 %d 层\n", x);
printf("第 %d 层输出的字符是 %c\n", x, shuzu[x]);
// 递归调用自身,处理下一个字符
digui(shuzu, x + 1);
printf("返回递归第 %d 层\n", x);
}
int main() {
char str[] = { "abcd" };
len = strlen(str);
// 调用递归函数,从第0层开始
digui(str, 0);
return 0;
}
运行结果
过程分析
-
在
main
函数中调用digui(str, 0)
:shuzu
被设置为字符串 "abcd"。x
初始为0。
-
进入递归的第0层:
- 打印进入递归的信息。
- 输出第0层的字符 'a'。
- 递归调用
digui(shuzu, 1)
。
-
进入递归的第1层:
- 打印进入递归的信息。
- 输出第1层的字符 'b'。
- 递归调用
digui(shuzu, 2)
。
-
进入递归的第2层:
- 打印进入递归的信息。
- 输出第2层的字符 'c'。
- 递归调用
digui(shuzu, 3)
。
-
进入递归的第3层:
- 打印进入递归的信息。
- 输出第3层的字符 'd'。
- 递归调用
digui(shuzu, 4)
。
-
进入递归的第4层:
- 基本情况触发,
x
已经等于字符串长度,返回。
- 基本情况触发,
-
返回递归的第3层:打印返回递归的信息。
-
返回递归的第2层:打印返回递归的信息。
-
返回递归的第1层:打印返回递归的信息。
-
返回递归的第0层:打印返回递归的信息。
(by 归忆)