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

时间:2013-06-25 03:27:06

标签: c recursion

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.提前感谢

6 个答案:

答案 0 :(得分:12)

在这个递归调用中:

reverse(no--);

您正在传递no--。由于这使用了后缀 - 运算符,这意味着“递减no,然后将no原始值传递给reverse的递归调用。”这会导致无限递归,因为您经常在reverse设置为相同值的情况下进行递归调用。

要解决此问题,请将此更改为

reverse(no - 1);

请注意,没有理由在此处递减no,因为在当前的递归调用中,您将永远不会再次阅读no。您只需将no - 1的值传递给函数即可。实际上,您可能希望通常避免在递归调用中使用--,因为它几乎总是指示代码中的错误。

希望这有帮助!

答案 1 :(得分:3)

您在no上使用了后递减运算符。首先获取no的值并将其用作表达式的值,然后然后递减no(仍然使用未递减的值作为表达式的值)。您可能希望使用--no甚至no - 1。 (前者将修改no,而后者则不会,但无关紧要,因为在该点之后未引用no。)

答案 2 :(得分:0)

变化:

reverse(no--);

为:

reverse(no-1);

no--在减量发生之前返回原始值。所以这一行总是会调用reverse(5)。因此,无限循环。

答案 3 :(得分:0)

n--是后增量,首先使用n作为函数的参数,然后递减n。

所以n--基本上就是

reverse(n);
n = n - 1;

你想要的是--n

答案 4 :(得分:0)

您正在使用后减量。首先评估,然后降低价值。

改变这个:

reverse(no--);

到此:

return reverse(--no);

- 没有是预减量。首先减少“否”,然后将值传递给反向。

请注意,我正在返回结果值,由于声明,函数总是必须返回一个int。

答案 5 :(得分: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时都会返回一个数字,并在使用之前减少数量。