递归调用后,下一个printf会自动打印递增的值

时间:2015-11-22 05:47:11

标签: c recursion

我在递归中遇到了奇怪的事情,请按照下面的代码按降序打印数字。但是它很快完成递归并执行下一个printf语句,它会在程序中自动递增而不会增加语句。

int main()
{
    int count=10;    
    counter(count);    
}

int counter(int count)    
{    
    if(count>0)    
    { 
        printf("%d\n",count);   
        counter(count-1);    
        printf("%d",count) //THIS STATMENT MAKES THE VALUE INCREMENT    
        //AFTER THE RECURSION    
    }    
}

输出:

10
9
8
7
6
5
4
3
2
1
1  //2nd printf results in increment without any increment operator 
2
3
4
5
6
7
8
9
10

2 个答案:

答案 0 :(得分:2)

致电时

counter(count-1);

使用值counter-1调用函数的新调用,但函数当前调用中counter的值不会更改。因此,当函数返回时,下一次调用printf会打印counter的值。

如果您在count为2时可视化通话,则会获得

printf("%d\n",2);   
counter(1);    
printf("%d\n",2);  // I am assuming you have \n there.

如果您将通话扩展为counter(1),则会获得:

printf("%d\n",2);
  printf("%d\n",1);
  counter(0);
  printf("%d\n",1);
printf("%d\n",2);

counter(0)不会打印任何内容。它没有做任何事情就返回。因此,该代码块相当于:

printf("%d\n",2);
  printf("%d\n",1);
  printf("%d\n",1);
printf("%d\n",2);

如果你从更高的数字开始,比如10,你得到:

printf("%d\n",10);
  printf("%d\n",9);

     ...

         printf("%d\n",2);
           printf("%d\n",1);
           printf("%d\n",1);
         printf("%d\n",2);

     ...

  printf("%d\n",9);
printf("%d\n",10);

这解释了输出。

答案 1 :(得分:0)

您的回答不准确,无法解释答案。 直接改值计数器后还是会增加

int main()
{
   int count=10;    
   counter(count);    
}

int counter(int count)    
{    
  if(count>0)    
  {  
    count = count-1
    printf("%d\n",count);   
    counter(count);    
    printf("%d",count) //THIS STATMENT MAKES THE VALUE INCREMENT    
    //AFTER THE RECURSION    
  }    
}

上面的代码仍然会产生一些相同的输出,只需稍作改动