C中输出的递归顺序

lio*_*ior 5 c recursion

我在C中具有此递归函数,并且我试图理解为什么它以这种方式打印:

void rec(int x, int y){
 if (x == y) 
     return;
 rec(x--, y+1);
 printf("%3d%6.2f\n", x, (float) y);
}
Run Code Online (Sandbox Code Playgroud)

我知道rec(8,4)的输出是:

7 7.00
7 6.00
7 5.00
7 4.00
Run Code Online (Sandbox Code Playgroud)

为什么X值保持为7?据我所知,x--应该仅在写入行之后才发生。否则,为什么值保持为7而不减小?另外,为什么y值会减小?是因为在递归停止时它开始打印?

我是C语言的新手,并不习惯需要注意的所有小细节(我来自Java)

谢谢你的帮助!

jaa*_*aaq 4

这不是语法问题,而是递归和调用堆栈的问题。

首先:doingrec(x--, y+1)将x的原始值传递给函数,函数完成后,x被修改(但修改永远不会保存)。如果你像这样传递它,同样的情况也会发生在 y 上:rec(x--, y++)。“正确”的做法是在评估函数之前更改值,就像您之前对 y 所做的那样或如下所示:rec(--x, ++y)

执行此操作后,您将看到 y 正在减少,而 x 正在增加。为什么?因为调用堆栈。最后调用的函数将首先执行。为此您可以想象调用函数只需复制粘贴已设置参数的代码。然后它看起来像这样:

void rec(int x, int y){
 if !(x == y) 
     rec(--x, ++y);

 printf("%3d%6.2f\n", x, (float) y);
}

...

if !(4 == 0){ 
     if !(3 == 1) 
          if !(2 == 2) 
              rec(--x, ++y);} // we are done now, no more "code is inserted"

          printf("%3d%6.2f\n", 2, (float) 2);

     printf("%3d%6.2f\n", 3, (float) 1);

printf("%3d%6.2f\n", 4, (float) 0);
Run Code Online (Sandbox Code Playgroud)