【发布时间】:2019-12-04 14:56:26
【问题描述】:
我试图找出一个简单递归函数的输出,该函数计算 c 中函数内给定数字的阶乘。我对执行顺序感到困惑
这个printf 线printf("returning %d\n", val);
我希望这段代码的输出是:
called with par = 4
called with par = 3
called with par = 2
called with par = 1
returning 24
24
但是输出是:
called with par = 4
called with par = 3
called with par = 2
called with par = 1
returning 2
returning 6
returning 24
代码:
int factorial(int n);
int main(void)
{
printf("%d",factorial(4));
}
int factorial(int n)
{
int val;
if ((n == 0) || (n == 1))
{
printf("called with par = %d\n", n);
return 1;
}
else
{
printf("called with par = %d\n", n);
val = n * factorial(n - 1);
printf("returning %d\n", val);
return val;
}
}
【问题讨论】:
-
每次调用它,它都会返回到调用它的位置。在它调用自己之后,它又返回到自己。这很令人惊讶吗?
-
你能解释一下为什么你认为你的输出是正确的吗?
-
除基本情况 (
n == 0 || n == 1) 之外的每个调用都将打印“调用方式”和“返回”。 -
如果您学习如何使用调试器逐个语句逐句执行代码,并逐步执行递归调用,可能会帮助您更好地了解正在发生的事情。