有谁可以告诉我将0 1 2 0作为以下程序输出的原因?
#include <stdio.h>
main() {
e(3);
}
void e(int n) {
if(n>0) {
e(--n);
printf("%d",n);
e(--n);
}
}
输出为0 1 2 0
答案 0 :(得分:4)
下面&#39;从e(3)
调用main
之后的执行流程。
e(3)
e(2)
e(1)
e(0) ... return
n is now 0
print n. results in output 0
e(-1) ... return
n is now 1
print n. results in output 1
e(0) ... return
n is now 2
print n. results in output 2
e(1)
e(0) ... return
n is now 0
print n. results in output 0
e(-1) ... return
return
你看到了输出
0 1 2 0
答案 1 :(得分:2)
我假设您想要以下内容:
#include <stdio.h>
void e(int);
int main()
{
e(3);
return 0;
}
void e(int n)
{
if(n > 0) {
e(--n);
printf("%d", n);
e(--n);
}
}
这是一个递归函数的例子 - 一个调用自身的函数。这里,在每次调用时,参数递减,并且再次调用函数,直到不满足条件n > 0
。然后,printf("%d", 0)
发生了。现在第二个e(--n)
在n
至少2
之前无效,因为if
条件无法传递,其值n
小于1
{1}}。进一步printf()
以与调用相反的顺序发生,因为函数调用将从堆栈中删除。当值达到2
时,第二个e(--n)
有机会产生效果,从而打印0
。
你需要了解递归(如果你还没有),那么你就可以很好地了解事情是如何发生的。此外,如果了解有关在调用函数时如何设置堆栈以及稍后返回的更多内容,它将对您有所帮助。
答案 2 :(得分:0)
在解密代码之后,可以在调试器中一次性推断出结果的原因。
e()是递归的,在打印之前调用一次,之后调用一次。所以在你打印你的打印声明之前,你必须再次经历e,然后再次经历,直到最终达到0。
之后事情就开始解体了,你会看到印刷品突然出现,但由于第二次调用e(n),其中n进入负数,因此它仍然是一个很大的递归混乱。我很感激n被签名,因为如果它是无符号的,它将循环到2 ^ 32并且程序将陷入,几乎是无限循环。
所以是的,TL; DR:通过调试器运行它并从FUBAR中学习这样的递归。
答案 3 :(得分:0)
&#39;流程&#39;如下:
main -> e(3)
e(3) -> IF(3>0)
{
// n is pre-decremented to 2
e(2) -> IF(2>0)
{
// n is pre-decremented to 1
e(1) -> IF(1>0)
{
// n is pre-decremented to 0
e(0) -> 0 is not > 0 so this call does nothing.
// n is still 0 in this function call so...
printf(0) <-- The first '0' in the output
// n is pre-decremented to -1
e(-1) -> -1 is not > 0) so this call does nothing.
}
// n is still 1 in this function call so...
printf(1) <-- The '1' in the output
// n is pre-decremented to 0
e(0) -> 0 is not > 0 so this call does nothing
}
// n is still 2 in this function call so...
printf(2) <-- The '2' in the output
// n is pre-decremented to 1
e(1) -> (1 is > 0)
{
// n is pre-decremented to 0
e(0) -> 0 is not > 0 so this call does nothing
// n is still 0 in this function call so...
printf(0) <-- The second '0' in the output
// n is pre-decremented to -1
e(-1) -> -1 is not > 0 so this call does nothing
}
}
如果您更清楚地设置代码会有所帮助:
#include<stdio.h>
main()
{
e(3);
}
void e(int n)
{
if(n>0)
{
e(--n); // First recursion here, but with n=n-1 on entry to the call.
printf("%d",n); // outputs (original value of n) - 1.
e(--n); // Second recursion here, now with n=n-2 on entry to the call.
}
}