递归函数
C 语言的函数都支持递归, 也就是说,每个函数都可以直接或者间接第调用自己。所谓的间接调用,是指在递归函数调用的下层函数中再调用自己。
递归关系图如下:
递归之所以能实现,是因为函数的每个执行过程在栈中都有自己的形参和局部变量的副本,这些副本和该函数的其他执行过程不发生关系。
考虑一个数字的阶乘,通常写为 5! = 5 * 4 * 3 * 2 * 1。
也可以将此计算视为重复计算num * (num -1),直到num为1。
递归函数是一个调用其自身的函数,它包括一个退出条件,用于结束递归调用。在计算阶乘时,退出条件为num等于1。
例如:
#include <stdio.h>
// 声明函数 factorial,用于计算阶乘
int factorial(int num);
int main() {
int x = 5;
printf("The factorial of %d is %d\n", x, factorial(x)); // 打印 x 的阶乘结果
return 0;
}
// 定义函数 factorial,用于计算阶乘
int factorial(int num) {
if (num == 1) /* 基本情况,阶乘的终止条件 */
return 1;
else
return (num * factorial(num - 1)); // 递归调用自身,计算 num 的阶乘
}
这段代码实现了以下功能:
-
引入头文件
stdio.h
,其中包含了输入输出函数的定义。 -
声明函数
factorial
,用于计算阶乘。 -
在
main
函数中声明变量x
,初始值为 5。 -
使用
printf
函数打印出结果,显示x
的阶乘结果。 -
返回 0,表示程序成功执行并退出。
函数 factorial
的功能是计算给定数字的阶乘。在函数体内,使用递归的方式进行计算。如果输入的数字 num
等于 1,表示已经到达阶乘的终止条件,直接返回 1。否则,将 num
与 factorial(num - 1)
相乘,即调用自身来计算 num - 1
的阶乘,并返回结果。
程序输出为:The factorial of 5 is 120
以上程序的执行过程拆解:
2*factorial(1)
3*factorial(2)
4*factorial(3)
5*factorial(4)
当达到退出条件时,返回值1触发堆叠调用的完成。
从最新到最旧的返回值创建以下计算,最后的计算(5 * 24)返回到调用函数main():
2 * 1
3 * 2
4 * 6
5 * 24
注意: 递归解决方案需要一个退出条件来防止无限循环。
【选词填空】定义用于计算n阶乘的递归函数:
int fact(int n) {
if (n == 1) 1;
return n * (n - 1);
}
n
break
fact
return