0

我对编程真的很陌生(我是一名电子和通信工程师),我无法弄清楚为什么一个程序有效而另一个程序无效。

在进一步学习之前,我想对递归函数有一个很好的理解。我将不胜感激有关此的任何帮助。

我知道 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*/

谢谢!

PS:如果这是一个微不足道或愚蠢的问题,请原谅我,但我被困在这个问题上,我认为这是我可以寻求帮助的最佳地方。

4

2 回答 2

4
void rec(int x) {
    if (x>0)
        rec(x--);
    printf("%d",x);
}

这将永远递归(或至少直到你用尽堆栈空间)。x--表示使用的当前x然后递减它。

换句话说,让我们rec使用参数 20 进行调用。它大于零,因此它将依次rec以当前值 20 再次调用,然后递减x(但在调用返回后有效。

因此,你永远rec用 20 的值跟注,这就是为什么你会耗尽你的筹码。

如果您更改x--为,它会在将其传递给函数之前--x递减,因此它将变为,此时它将运行备份打印所有这些值的堆栈。x 20, 19, 18, ... 1, 0

如果你printf ("before: %d\n", x)在语句之前放了一个if,你会看到很多20行输出到屏幕上。

于 2012-10-01T05:23:25.993 回答
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
于 2012-10-01T05:23:28.357 回答