C 无法理解此代码的输出

C 无法理解此代码的输出,c,recursion,C,Recursion,我无法理解输出。请解释一下。我是一个新手代码爱好者。void abc(int n) 11 10 9 8 7 6 { 如果(n要使函数清晰,请按以下方式排除函数本身的递归代码 void abc(int n) { if (n<=10) { abc(++n); printf("%d\n",n); } } void main() { int m=5; abc(m); } ++n; 现在只需按以下方式添加递归调用 void abc(int

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

void abc(int n)
11
10
9
8
7
6
{
如果(n要使函数清晰,请按以下方式排除函数本身的递归代码

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

void main()
{
   int m=5;
   abc(m);
}
++n;
现在只需按以下方式添加递归调用

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

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

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

关于所有递归调用,如下所示:

abc(5)

这将调用值为5的函数abc。
现在,在打印之前,它将对abc进行递归调用,但在调用之前,它将把n的值从5增加到6。同样的情况也将发生在下一次调用中,从6增加到7,从7增加到8,从8增加到9,从9增加到10,从10增加到11。现在,在调用n=11时,if条件将失败,递归将停止。从递归调用返回时,它将打印increment从最后一次调用到第一次调用,即从11次调用到10次调用,依此类推,直到6次调用。事件顺序如下:

  • main
    调用
    abc(5)

  • abc(5)
    n
    在这些代码行中,首先是
    ,输出是什么

    11
    10
    9
    8
    7
    6
    
    如果您在
    6
    之前猜测
    7
    ,您是正确的。如果您调用两个打印内容的函数,则首先调用的函数将首先输出。这非常重要

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

    printf("7\n");
    printf("6\n");
    
    如果您执行
    abc(5)
    操作,其工作原理相同。
    abc(6)
    需要先输出。在
    abc(6)
    abc(7)
    中,需要先输出到
    11
    没有输出,然后返回,打印
    11
    10
    ,…
    n+1

    你可以反过来做! 假设您从基本情况开始,看到代码没有任何作用

    然后你看一下
    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”
    ,然后它会输出下一行
    “6\n”
    “11\n10\n9\n8\n7\n6\n”

    通过将代码写在纸上和/或使用调试工具逐步完成代码的功能,因此
    void main()
    不是标准的C-它应该是
    int main(void)
    (请参阅:)@TanmoyMukherjee:您可以通过单击分数下面的灰色复选标记接受其中一个答案。“
    printf(%d\n”“
    永远不会被调用”?什么?当然会被调用。你运行过这个代码吗?@unholyseep Woops.Updated。不,我没有运行这个代码。”这个过程一直重复到
    n@UnholySheep Happy now?另外,你能解释一下当n>10时会发生什么吗?@pookie——如果n>10,函数返回给调用者;因此当
    n
    增加到11
    abc()
    返回到上一个调用时,
    abc(10)
    ,并执行
    printf()
    ,打印
    11
    ,然后返回上一个调用,等等…非常感谢您的回答。我不清楚的一点是,为什么递增的值从最后一个打印到第一个…是因为中间值存储在堆栈上并从顶部弹出还是什么?运行函数abc(5)将类似于:if(nThanx)。我不明白为什么代码按递减顺序打印11然后10然后9…第一个示例中缺少大括号,第二个示例中的缩进和格式错误。@chqrlie谢谢。谢谢大家。现在已经很清楚了。您为新手学习编码提供了很多帮助。
    printf("7\n");
    printf("6\n");
    
    void abc(int n) {
        if (n <= 10) {
            n = n + 1;
            abc(n);
            printf("%d\n", n);
        }
    }
    
    11
    10  
    
    11
    10