所以我在 C 中玩递归,我不确定为什么会这样:
代码A
int foo(int x)
{
if (x==0) return 0;
else return foo(--x)+x;
}
int main() { printf("%d\n", foo(10));
代码 B
int foo(int x)
{
if (x==0) return 0;
else return foo(x--)+x;
}
int main() { printf("%d\n", foo(10));
代码 A 打印 45 而不是 55,我想通了。这是因为递归调用以这种方式解除:9+8+7+...+0 = 45
另一方面,代码 B 卡住了,永远不会返回提示!我必须 ctrl+c
它。为什么会卡住?是因为它永远不会减少超过 10 吗?
最佳答案
那是因为在代码段 B 中,x 在递归调用后 递减,所以函数总是用 foo(10) 调用
编辑:
正如 James McNellis 在其评论中指出的那样,x 在调用函数之前会递减,但它的原始值在调用中使用,而不是递减后的值。
基本上表达式 x-- 在 foo(x--) 之前求值,但它的值实际上是 x,因此调用函数时 x = 10
关于c - C 的这种行为是如何解释的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063323/