递归指的是一个函数自己调用自己,C语言中对于递归操作有以下几个要素:
- 递归函数及其定义
- 递归终止条件
- 递归调用及返回
下面将通过两个示例演示C语言中如何进行递归操作。
示例一: 阶乘
阶乘就是一个正整数n的阶乘是所有小于等于n的正整数的积,通常用符号!表示。例如:4! = 4 x 3 x 2 x 1 = 24。如下是一个递归函数实现:
int factorial(int n) {
if (n == 1) { // 终止条件
return 1;
} else {
return n * factorial(n-1); // 递归调用
}
}
递归函数需要一个终止条件,例如上述代码中的n=1时,我们不再继续调用递归函数而是直接返回1。否则的话,程序会继续调用递归函数,每次将n减1,直到n=1时停止,然后按照逆序的方式计算阶乘。例如,当n=5时,程序按照如下方式进行计算:5 x 4 x 3 x 2 x 1。
示例二: 斐波那契数列
斐波那契数列指的是一个数列,其第一项和第二项都为1,以后每一项都是由前两项相加得到。例如:1, 1, 2, 3, 5, 8, 13, 21, …。如下是一个递归函数实现:
int fibonacci(int n) {
if (n == 1 || n == 2) { // 终止条件
return 1;
} else {
return fibonacci(n-1) + fibonacci(n-2); // 递归调用
}
}
递归函数需要一个终止条件,例如上述代码中的n=1或n=2时,我们不再继续调用递归函数而是直接返回1。否则的话,程序会不断地调用递归函数,每次将n减1或减2。例如,当n=5时,程序按照如下方式进行计算:fibonacci(5) = fibonacci(4) + fibonacci(3) = (fibonacci(3) + fibonacci(2)) + fibonacci(3) = ((fibonacci(2) + fibonacci(1)) + fibonacci(2)) + (fibonacci(2) + fibonacci(1)) = ((1 + 1) + 1) + (1 + 1) = 5。
以上是两个常见的递归示例。在实际应用中,递归可以帮助程序员简化代码结构,尤其是当问题本身就包含递归结构时。但需要注意的是,递归很容易产生栈溢出等问题,因此应当适度使用。