我现在正在学习递归。这是三个代码。第一个和第三个是给我预期的输出,但第二个不是?有人能告诉我他们的区别是什么。
代码1:
void tail(int i){
if (i>0) {
printf("%d\n",i);
tail(i-1);
}
}
int main()
{
tail(5);
}
代码2:
void tail(int i){
if (i>0) {
printf("%d\n",i);
tail(i--);
}
}
int main()
{
tail(5);
}
代码3:
void tail(int i){
if (i>0) {
printf("%d\n",i);
tail(--i);
}
}
int main()
{
tail(5);
}
代码1的输出:
5 4 3 2 1
代码2的输出:
5 五 五 。 。 。无限
代码3的输出:
5 4 3 2 1
请帮帮我。我很困惑!
答案 0 :(得分:5)
答案 1 :(得分:2)
当然,代码2赢了。在代码2中,您键入tail(i--);
--
运算符(在变量名称之后)执行的操作是首先在您请求的行中使用他,然后将其减少一个。
我们说我有一行printf("%d", i--);
它会打印i
其当前值,并且只有在打印之后,它才会减少,它首先使用I,然后减少它 - 如果你只输入:
printf("%d", i);
i--;
关于变量之前的--
运算符。它首先会减少,然后执行请求的操作 - 因此printf("%d", --i);
会将i
减少一个,然后打印出来。
我们都同意代码1运行良好,代码2实际上处于无限循环中,因为你在调用函数后减少变量 - 所以它只在一个函数中减少。
基本上,它的作用就像:
printf("%d", i); //which is 5
tail(i);//which is still 5
i--; //will never get to this line because we called another function with variable 5
等等。 关于代码3,它工作得很好,它就像代码1(但是代码一号实际上不会减少变量,只需用变量-1调用函数)。
编辑: 有关详细信息,您可以在此article中搜索:)
答案 2 :(得分:0)
3必须工作。 2不起作用,因为我在传递给函数后递减。
答案 3 :(得分:0)
你应该在第二种情况下使用指针。每次将相同的值传递给递归函数时...首先进行函数调用,然后进行递减操作。因此,在每次递归调用中都有相同的值(5)。
答案 4 :(得分:0)
第二个没有给出您想要的输出,因为您正在使用后递减运算符i--
。
这意味着“使用i然后递减i”而不是--i
,这意味着“递减i然后使用i”。
因此,在第三种情况下,i
的值为5,递减为4,然后调用tail(4)
。
在第二种情况下,调用tail(i--)
,即调用tail(5)
,然后执行i-=1;
。
如果i--和--i作为独立语句给出,则它们是等效的,例如
for(int i=5;i>0;i--)
实际上与
相同for(int i=5;i>0;--i)
但在以下情况下:
int i=5;
int a=i--;
printf("%d %d", i, a);
这给出了put 5 5而
int i=5;
int a=--i;
printf("%d %d", i, a);
将输出4 4。