我真的很喜欢编程(我是电子和通讯工程师)而且我无法弄清楚为什么一个程序有效而另一个没有。
在进一步学习之前,我想先了解一下递归函数。我将不胜感激任何帮助。
我知道x ++和--x之间的区别。但在这个程序的上下文中,我认为这两个程序应该以相同的方式运行。但他们没有。
void rec(int x)
{
if(x>0)
rec(x--);
printf("%d",x);
}
int main()
{
rec(4);
_getch();
} /*This doesn't work. And shows a stackoverflow */
void rec(int x)
{
if(x>0)
rec(--x);
printf("%d",x);
}
int main()
{
rec(4);
_getch();
} /*This gives a proper output as expected*/
/*The output is 00123*/
谢谢!
P.S:如果这是一个微不足道或愚蠢的问题,请原谅我,但我坚持这一点,我认为这是我寻求帮助的最佳地点。
答案 0 :(得分:4)
void rec(int x) {
if (x>0)
rec(x--);
printf("%d",x);
}
这将永远递归(或者至少在你耗尽堆叠空间之前)。 x--
表示使用x
的当前值,然后减少它。
换句话说,让我们使用参数20调用rec
。这大于零,因此它将再次使用当前值20调用rec
然后递减x
(但在调用返回后有效。
因此,您永远使用值20来调用rec
,这就是为什么您要清空堆栈。
如果您将x--
更改为--x
,则会在将其传递给该函数之前递减x
,因此它会转到20, 19, 18, ... 1, 0
,它会在堆栈中重新打印所有这些值。
如果你在printf ("before: %d\n", x)
语句之前添加了if
,那么你会看到很多20
行输出到屏幕上。
答案 1 :(得分:1)
x--使用旧的x值(减量前)调用该函数。因此,您将获得无限递归,并使用相同的值调用自身。 --x用x的新(递减)值调用函数,因此最终命中x> 0条件。
另一种调查方法是执行以下操作:
int a, b;
a = b = 1;
printf("--a: %d b--: %d\n", --a, b--); // Output is --a: 0 b--: 1