C语言递归函数执行过程详解:阶乘函数Factorial(5)的执行顺序与结果
C语言递归函数执行过程详解:阶乘函数Factorial(5)的执行顺序与结果
本文以阶乘函数Factorial(5)为例,详细解析递归函数的执行顺序和运行结果。通过表格形式清晰展现每一步的执行情况,帮助您深入理解递归函数的执行机制。
代码示例:
int Factorial(int n) {
int temp;
if (n == 0) {
return 1;
} else {
temp = Factorial(n - 1);
temp = n * temp;
return temp;
}
}
int main() {
int F = Factorial(5);
printf("Factorial(5) = %d\n", F);
return 0;
}
程序运行结果:
Factorial(5) = 120
执行语句顺序与程序运行结果表格:
| 执行语句顺序 | 程序运行结果 | 参数表n | 返回地址 | 说明 | |--------------|-----------------------------|--------|--------------|-----------------------------------------------------------------------------| | (1) | | 5 | main函数 | 函数定义:int Factorial(int n); | | (2) | | 5 | main函数 | 定义局部变量temp。 | | (3) | | 5 | main函数 | 判断n是否为0,n=5不等于0,进入else分支。 | | (5) | | 5 | main函数 | 进入else分支。 | | (6) | | 4 | main函数 | 递归调用Factorial(n-1),n=5,执行Factorial(4),并保存当前函数的返回地址。 | | (1) | | 4 | main函数 | 函数定义:int Factorial(int n); | | (2) | | 4 | main函数 | 定义局部变量temp。 | | (3) | | 4 | main函数 | 判断n是否为0,n=4不等于0,进入else分支。 | | (5) | | 4 | main函数 | 进入else分支。 | | (6) | | 3 | main函数 | 递归调用Factorial(n-1),n=4,执行Factorial(3),并保存当前函数的返回地址。 | | (1) | | 3 | main函数 | 函数定义:int Factorial(int n); | | (2) | | 3 | main函数 | 定义局部变量temp。 | | (3) | | 3 | main函数 | 判断n是否为0,n=3不等于0,进入else分支。 | | (5) | | 3 | main函数 | 进入else分支。 | | (6) | | 2 | main函数 | 递归调用Factorial(n-1),n=3,执行Factorial(2),并保存当前函数的返回地址。 | | (1) | | 2 | main函数 | 函数定义:int Factorial(int n); | | (2) | | 2 | main函数 | 定义局部变量temp。 | | (3) | | 2 | main函数 | 判断n是否为0,n=2不等于0,进入else分支。 | | (5) | | 2 | main函数 | 进入else分支。 | | (6) | | 1 | main函数 | 递归调用Factorial(n-1),n=2,执行Factorial(1),并保存当前函数的返回地址。 | | (1) | | 1 | main函数 | 函数定义:int Factorial(int n); | | (2) | | 1 | main函数 | 定义局部变量temp。 | | (3) | | 1 | main函数 | 判断n是否为0,n=1不等于0,进入else分支。 | | (5) | | 1 | main函数 | 进入else分支。 | | (6) | | 0 | main函数 | 递归调用Factorial(n-1),n=1,执行Factorial(0),并保存当前函数的返回地址。 | | (1) | | 0 | main函数 | 函数定义:int Factorial(int n); | | (2) | | 0 | main函数 | 定义局部变量temp。 | | (3) | | 0 | main函数 | 判断n是否为0,n=0等于0,返回1。 | | (4) | Factorial(0) = 1 | 0 | main函数 | 返回值为1。 | | (5) | | 1 | main函数 | 由于n=0时返回了1,当前函数不再执行else分支,回到上一个调用Factorial(1)的函数,并继续执行。 | | (7) | | 1 | main函数 | temp = n * temp = 1 * 1 = 1。 | | (8) | Factorial(1) = 1 | 1 | main函数 | 返回值为1。 | | (9) | | 1 | main函数 | 返回temp的值,回到上一个调用Factorial(1)的函数,并继续执行。 | | (5) | | 2 | main函数 | 由于n=1时返回了1,当前函数不再执行else分支,回到上一个调用Factorial(2)的函数,并继续执行。 | | (7) | | 2 | main函数 | temp = n * temp = 2 * 1 = 2。 | | (8) | Factorial(2) = 2 | 2 | main函数 | 返回值为2。 | | (9) | | 2 | main函数 | 返回temp的值,回到上一个调用Factorial(2)的函数,并继续执行。 | | (5) | | 3 | main函数 | 由于n=2时返回了2,当前函数不再执行else分支,回到上一个调用Factorial(3)的函数,并继续执行。 | | (7) | | 3 | main函数 | temp = n * temp = 3 * 2 = 6。 | | (8) | Factorial(3) = 6 | 3 | main函数 | 返回值为6。 | | (9) | | 3 | main函数 | 返回temp的值,回到上一个调用Factorial(3)的函数,并继续执行。 | | (5) | | 4 | main函数 | 由于n=3时返回了6,当前函数不再执行else分支,回到上一个调用Factorial(4)的函数,并继续执行。 | | (7) | | 4 | main函数 | temp = n * temp = 4 * 6 = 24。 | | (8) | Factorial(4) = 24 | 4 | main函数 | 返回值为24。 | | (9) | | 4 | main函数 | 返回temp的值,回到上一个调用Factorial(4)的函数,并继续执行。 | | (5) | Factorial(5) = 120 | 5 | main函数 | 由于n=4时返回了24,当前函数不再执行else分支,继续执行。 | | (6) | | 5 | main函数 | temp = Factorial(n - 1) = 24。 | | (7) | | 5 | main函数 | temp = n * temp = 5 * 24 = 120。 | | (8) | | 5 | main函数 | 返回值为120。 | | (9) | | 5 | main函数 | 返回temp的值,回到main函数,并继续执行。 |
说明:
- 参数表n:表示当前函数调用时的n值。
- 返回地址:表示当前函数执行完毕后,应该返回到哪个函数。
通过这个表格可以清晰地看到递归函数Factorial(5)的执行过程,从函数调用到函数返回值,一步一步地展现了递归函数的运行机制。
总结:
递归函数通过不断调用自身来解决问题,其执行顺序需要从最后的函数调用开始,逐步回溯到第一个函数调用。通过表格的形式可以更加清晰地理解递归函数的执行过程,并有助于分析和调试递归函数代码。
希望本文能够帮助您更好地理解递归函数的执行机制。
原文地址: https://www.cveoy.top/t/topic/kWj 著作权归作者所有。请勿转载和采集!