以下程序的输出如下所示: n = 2 n = 1 n = 0 n = -1 n = 0 n = 1
我可以执行程序直到它打印出 n = -1,但为什么它返回并在最后打印 n = 0 和 n = 1?
#include <stdio.h>
void countdown (int n)
{
printf("n = %d\t", n);
n--;
if (n >= 0)
{
countdown(n);
}
printf("n = %d\t", n);
}
int main()
{
countdown(2);
return 0;
}
最佳答案
函数中有两个printf
,最后3个printfs
(n = -1 n = 0 n = 1
)在你的顺序
由第二个 printf
调用打印,这就是它再次上升的原因。你忘了那个。什么时候
递归结束,函数返回到上一级并继续
从那里开始。
最终n--
对n==0
执行,n
变为负数,n >= 0
是评价
为 false 并且 countdown(n)
不再执行。那是终端案例。
这意味着该函数停止调用自身并继续执行下一条语句,即第二条语句
printf
,它将打印 n = -1
。
然后函数返回最后一个并继续执行第二个
printf
并得到 n = 0
。然后函数结束,返回到第一个
级别,第二个 printf
被执行,你得到 n = 1
。然后
函数返回到 main
。
如果您在递归中稍微更改 printf
,您会看到
立即获得输出的原因。试试这个:
void countdown (int n)
{
printf("[1] n = %d\n", n);
n--;
if (n >= 0)
{
countdown(n);
}
printf("[2] n = %d\n", n);
}
现在输出将是
[1] n = 2
[1] n = 1
[1] n = 0
[2] n = -1
[2] n = 0
[2] n = 1
关于c - 跟踪递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50071086/