我得到输出'0,1,2,0'。请有人帮我这个函数调用是如何工作的。我怀疑在递减n之后,if语句将不会执行,因为它不会大于0.因此将没有输出。但结果是别的。
#include <stdio.h>
void fun(int);
int main(void)
{
int a=3;
fun(a);
return 0;
}
void fun(int n)
{
if(n > 0)
{
fun(--n);
printf("%d,", n);
fun(--n);
}
}
答案 0 :(得分:0)
您从内部调用fun()
,之前的和<{em>之后的 printf()
。因此,您将首先从printf
的最深入调用中看到fun()
。
@ForceBru是绝对正确的,你可以 - 而且,如果你想成为程序员,需要能够 - 在脑海中或纸上追踪代码。这是一个例子。
第一次调用fun()
时的,同样是3. 3&gt; 0这样再次调用fun()
,使用_pre_decremented值(因此n
设置为2,而2传递给fun()
。
整个过程再次发生。 2&gt;为0 --n
或1传递给fun
。
在第3次深度调用中,n
为1.仍然大于0,因此fun(--n)
再次运行,n被预先计算为0.
现在在fun()
的第四次调用中,n最终为0.没有任何反应。
第三次调用,第一次fun()
返回。 Rember,此fun()
调用的n
为1,但此时它已减少为0。打印0。然后n
再次递减(到-1,它是一个带符号的int)并调用fun(-1)
,但由于-1 > 0
为假,所以没有任何反应。第三次调用返回。
第二次调用已传递2但后来减少为1. 1打印,然后fun(--n)
变为fun(0)
,下一次fun() invcocation is
有趣(-1){{1} } fun()`返回。
最后,第一次调用and also does nothing. The second invocation of
,即main中的一个,正在执行agian。它从3开始,但递减到2.打印出2。然后,fun()
或1最后一次传递给--n
。 fun()
所以1>0
- 1 fun() is invoked again, and outputs
fun()or 0 just like it did the first time it was passed a 1. The first invocation's recursive calls to
0,1,2,0`。
在纸上自己走一遍,因为递归函数可能会让人很困惑。我不明白为什么你自己得到了这个输出,直到我完成代码,并且我已经在c中编程了20年!