C编程语言中的递归

时间:2014-06-16 08:43:19

标签: c recursion tail-recursion

我现在正在学习递归。这是三个代码。第一个和第三个是给我预期的输出,但第二个不是?有人能告诉我他们的区别是什么。

代码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

请帮帮我。我很困惑!

5 个答案:

答案 0 :(得分:5)

  1. 结果符合预期
  2. 递减是递减后的,所以它首先使用当前值然后递减。所以函数会被当前值重复调用,因此无限循环。
  3. 对我来说很好。与第一个相似

答案 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。