无法理解本准则的输出

时间:2017-07-09 09:33:44

标签: c recursion

void abc(int n) {
    if (n <= 10) {
        abc(++n);
        printf("%d\n", n);
    }
}

void main() {
    int m = 5;
    abc(m);
}

输出显示:

11
10
9
8
7
6

我无法理解输出。请解释。我是一个新手代码爱好者。

5 个答案:

答案 0 :(得分:2)

事件的顺序如下:

  • main来电abc(5)
  • abc(5)n<= 10,因此n会增加到6,并调用abc(6)
  • abc(6)n<= 10,因此n会增加到7,并调用abc(7)
  • abc(7)n<= 10,因此n会增加到8,并调用abc(8)
  • abc(8)n<= 10,因此n会增加到9,并调用abc(9)
  • abc(9)n<= 10,因此n会增加到10,并调用abc(10)
  • abc(10)n<= 10,因此n会增加到11,并调用abc(11)
  • abc(11)n不是<= 10,函数返回时没有任何输出。
  • 返回abc(10):其自己的n变量仍为11printf打印11,函数返回。
  • 返回abc(9):其自己的n变量仍为10printf打印10,函数返回。
  • 返回abc(8):其自己的n变量仍为9printf打印9,函数返回。
  • 返回abc(7):其自己的n变量仍为8printf打印8,函数返回。
  • 返回abc(6):其自己的n变量仍为7printf打印7,函数返回。
  • 返回abc(5):其自己的n变量仍为6printf打印6,函数返回。
  • main返回

完成输出:

11
10
9
8
7
6

abc()的每个实例都有自己的局部变量n值,这解释了为什么不同实例打印的值不同。

请注意,您还应该:

  • 包括<stdio.h>
  • 使用此原型定义mainint main(void)
  • 为了获得好的风格,请在return 0;末尾添加main语句。

答案 1 :(得分:0)

void abc(int n)
{
   if (n<=10)
   {
      abc(++n);
      printf("%d\n",n);
   }
}

void main()
{
   int m=5;
   abc(m);
}

调用main时,变量m初始化为5

然后调用

abc并将5传递给它。

首次执行abc时,n = 5。如果n小于或大于10,则再次调用abc,但这次使用1+n。因此,由于5小于10,因此调用abc并将6传递给它。

答案 2 :(得分:0)

要使函数清除,请按以下方式排除它自身的递归代码

void abc(int n)
{
if (n<=10){
    ++n;
    printf("%d\n",n);
    }
}

因此,如果使用参数等于5调用函数,则函数输出6.如果使用参数等于10调用函数,则函数输出11由于表达式语句

++n;

现在只需按以下方式添加递归调用

void abc(int n)
{
if (n<=10)
    ++n;
    {abc( n);
    printf("%d\n",n);
    }
}

您将获得所描述的结果。

考虑到根据C标准,函数main应声明为

int main( void )

答案 3 :(得分:0)

我首先建议你阅读递归的基础知识。这对你有好处。

现在关于所有的递归调用,它将如下所示:

  

ABC(5);

这将使用值5调用函数abc。 现在在打印它之前,它将对abc进行递归调用,但在调用它之前会将n的值从5增加到6.在下一次调用中将发生同样的事情,从6到7,7到8,8到9,9现在,在n = 11的调用中,if条件将失败并且递归将停止。从递归调用返回时,它将打印增量值,但从最后一次调用到第一次调用,即。为11比10,依此类推至6月。

答案 4 :(得分:0)

首先在这些代码行中,输出是什么?

printf("7\n");
printf("6\n");

如果你在7之前猜测6你是对的。如果你调用两个打印东西的函数,那么先调用的函数将首先输出。这非常重要

让我们首先重写你的函数,这样每一行都不会做单独的事情。我正在考虑改变++n

void abc(int n) {
    if (n <= 10) {
        n = n + 1;
        abc(n);
        printf("%d\n", n);
    }
}

因此,如果您将9传递给此,则会先将n更改为10,然后致电abc(10)并获取的输出它打印10。对abc(10)的调用会将其n增加到11并首先调用abc(11),这不会执行任何操作,然后执行printf "11\n"并返回n10的呼叫,并在返回初始呼叫之前执行printf "10\n"

输出结果为:

11
10  

如果你abc(5)它的工作方式相同。 abc(6)需要先输出。在abc(6) abc(7)需要首先输出到11它没有输出然后它返回,打印1110 ,. ...... n + 1

你可以反过来做到这一点!

让我们说你从基础案例abc(11)开始,看看代码没有做任何事情。

然后你看看abc(10)。您看到它会先n增加到11,然后调用我们之前看到的abc(11)无效,然后打印n,从而11。因此abc(10)打印"11\n"

如果查看abc(9),您会看到n增加到10,然后会调用abc(10)。你已经知道它打印"11\n",然后它会printf向输出添加“10 \ n”,因此:

11
10

现在,如果您使用较低的一个数字执行此操作,最终会转到abc(5) ..它会将n增加到6,然后调用您知道输出abc(6) "11\n10\n9\n8\n7\n" 1}}然后它执行打印"6\n"的下一行,输出abc(5) "11\n10\n9\n8\n7\n6\n"