为什么这个递归函数会无限循环而不是倒序打印数字?

4
int reverse(int);
void main()
{
     int no =5;
     reverse(no);
}

int reverse(int no)
{

 if(no == 0)
      return 0;
else 
 printf("%d",no);

reverse(no--);
}

这个程序进入了无限循环。为什么会这样?我无法得到期望的输出。期望的输出应该是5 4 3 2 1。谢谢。


1
顺便说一下,应该是 int main()void main 是不可移植的,在所有编译器上都无法工作。 - hugomg
调试器在这种情况下非常有用... - antak
6个回答

12
在这个递归调用中:
reverse(no--);

您正在传递no--。由于这使用后缀--运算符,这意味着“递减no,然后将no原始值传递到对reverse的递归调用中。” 这会导致无限递归,因为您不断地使用reverse相同的值进行递归调用。

为了解决此问题,请更改为如下:

reverse(no - 1);
注意这里没有必要对no进行递减操作,因为在当前的递归调用中,您不会再次读取no的值。您可以将no - 1的值直接传递给函数。实际上,通常应避免在递归调用中使用--,因为这几乎总是代码错误的标志。
希望这可以帮到你!

3
你在 no 上使用了后减运算符。这首先获取 no 的值,并将其用作表达式的值,然后再递减 no(仍使用未递减的值作为表达式的值)。你可能想要使用 --no,甚至只是 no - 1。(前者将修改 no,而后者不会,但由于在该点之后没有引用 no,因此并不重要。)

2
我强烈建议不要使用减量操作 - no 永远不会再次被读取,并且使用减量操作可能意味着 OP 误解了在每个函数调用中 no 是一个不同的变量。 - templatetypedef

0

更改:

reverse(no--);

至:

reverse(no-1);

no-- 返回递减发生之前的原始值。所以这行代码将一直调用 reverse(5)。因此,造成了无限循环。


0

你正在使用后减操作符。先计算值,然后减少。

将此改为:

reverse(no--);

转换为:

return reverse(--no);

--no 是预减。先减少“no”,然后将值传递给反转。

请注意,我正在返回结果值,您的函数必须始终返回一个int,因为它的声明如此。


0

n-- 是后置递减运算符,它首先将 n 作为函数参数使用,然后再将 n 减一。

因此,n-- 的本质是

reverse(n);
n = n - 1;

你想要的是 --n

0

你想要做什么

int reverse(int);
int main()
{
    int no =5;
    reverse(no);
}

int reverse(int no)
{
    if(no == 0)
        return 0;
    else 
        printf("%d",no);
    return reverse(--no);
}

这样每次调用reverse时,您都会返回一个数字,并在使用它之前对其进行递减。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接