首次调用factorial()后,n
的值将存储在哪里?
当n=1
然后返回1
时,为什么res
在主要功能中等于1
?
#include<stdio.h>
int factorial(int n)
{
if(n<=1)
return 1;
else
return n*factorial(n-1);
}
int main()
{
int res =factorial(3);
printf("%d",res) ;
}
答案 0 :(得分:3)
运行时堆栈总共有四个函数:main(),factorial(3),factorial(2)和factorial(1)。每个都有自己的可变空间。变量 n 有三个个实例,每次调用 factorial 一个。
当factorial(1)返回1时,该值不会返回到main(),因为main()不是调用它的:factorial(2)调用它。 该实例执行操作2 * 1并返回2.该实例的调用者是factorial(3),它接收2,执行操作3 * 2,并返回值6到< em>它的调用者,main()。
这有助于清除它吗?如果没有,我有两个建议:
(1)在StackOverflow和互联网上搜索此主题;有很多详细的 factorial 的演练示例。
(2)插入 print 语句来跟踪数据流和执行。在factorial中,将计算和返回分开,因此您可以在其间放置 print :
catch = factorial(n-1)
result = n * catch
print n, catch, result
return result
答案 1 :(得分:1)
每次调用函数时,其参数和局部变量都会被压入堆栈。在递归函数的情况下,堆栈上将有一组变量用于函数的每次活动调用。
在此示例中,对factorial
的第一次调用将n
设置为3.在该函数中,再次调用factorial
,这次将n
设置为2它再次调用自己n
设置为1.在最后一次调用中,它返回值1.这将返回到先前的调用,其中n
为2,然后返回{{ 1}}这是2.此值返回到2 * 1
为3的第一次调用,并返回n
,其中6为3*2
。
所以调用堆栈看起来像这样:
main
答案 2 :(得分:1)
n
不以全局变量或静态变量的形式存储 - 它存储在堆栈中。调用带参数的函数将参数压入堆栈。
了解运行程序时发生的情况:
factorial(3)
被调用(main
)n
不等于或小于1 factorial(2)
时,结果将乘以n
(是3)。n
不等于或小于1 factorial(1)
时,结果将乘以n
(是2)。n
现在等于或小于1时,函数返回1 factorial(2)
返回1 * 2 factorial(3)
返回2 * 3 res
将为6