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

4

6 回答 6

12

在这个递归调用中:

reverse(no--);

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

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

reverse(no - 1);

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

希望这可以帮助!

于 2013-06-25T03:29:37.793 回答
3

您在no. 首先获取的值no并将其用作表达式的值,然后递减no(仍然使用未递减的值作为表达式的值)。您可能想使用--no甚至只是no - 1. (前者会修改no,而后者不会,但这没关系,因为no在那之后没有被引用。)

于 2013-06-25T03:28:52.300 回答
0

改变:

reverse(no--);

至:

reverse(no-1);

no--返回递减发生前的原始值。所以这条线会一直调用reverse(5)。因此,无限循环。

于 2013-06-25T03:30:10.130 回答
0

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

所以n--本质上是

reverse(n);
n = n - 1;

你想要的是--n

于 2013-06-25T03:30:23.623 回答
0

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

改变这个:

reverse(no--);

对此:

return reverse(--no);

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

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

于 2013-06-25T03:31:11.487 回答
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 时都会返回一个数字,并且在使用它之前减少 no 。

于 2013-06-25T04:34:54.337 回答