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.提前感谢
答案 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时都会返回一个数字,并在使用之前减少数量。