【发布时间】:2015-04-04 11:53:27
【问题描述】:
我试图澄清递归调用的执行顺序。我通过这个链接阅读: Dynamic programming and Divide and conquer
函数是这样写的:
int Fibonacci(int n) {
if (n <= 1) return n;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
调用顺序是这样描述的:
如果你追踪计算斐波那契(4)的调用,我们得到
Fibonacci(4) 调用 Fibonacci(3) 和 Fibonacci(2)
Fibonacci(3) 调用 Fibonacci(2) 和 Fibonacci(1)
Fibonacci(2) 调用 Fibonacci(1) 和 Fibonacci(0)
Fibonacci(2)(另一个)调用 Fibonacci(1) 和 Fibonacci(0)
斐波那契(1) 终止。
斐波那契(1) 终止。
斐波那契(1) 终止。
斐波那契(0) 终止。
Fibonacci(0) 终止。
这带来了两个问题:
(1) 对于此代码:
return Fibonacci(n - 1) + Fibonacci(n - 2);
+ 号左侧的调用总是在右侧调用之前被调用吗?我认为我们得到了某种深度优先的函数调用链,其中直线调用 Fib(5)...Fib(4)...Fib(3)...Fib(2)...Fib( 1) 在树分支过程中调用其他任何内容之前连续调用。这是真的吗?
(2) 我不明白为什么分支会按此顺序终止: 斐波那契(1) 终止。 斐波那契(1) 终止。 斐波那契(1) 终止。 斐波那契(0) 终止。 Fibonacci(0) 终止。
我认为终止顺序只是树底部从左到右的叶子顺序: 1 0 1 1 0
感谢您对此的任何见解。
【问题讨论】: