我在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)
谢谢你的帮助!
这不是语法问题,而是递归和调用堆栈的问题。
首先: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)