我试图弄清楚递归调用的执行顺序。我通读了这个链接: Dynamic programming and Divide and conquer
这个函数写得像这样:
int Fibonacci(int n) {
if (n <= 1) return n;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
电话订单的描述如下:
如果你追踪完成计算Fibonacci(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
感谢您对此有任何见解。
答案 0 :(得分:0)
我猜你是对的。我刚做了一个小测试:
int fibo(int n) {
if (n <= 1) return n;
System.out.println("fibo " + n + " calls fibo " + (n - 1) + " and fibo " + (n - 2));
int f1 = fibo(n - 1);
System.out.println("fibo " + (n - 1) + " terminates");
int f2 = fibo(n - 2);
System.out.println("fibo " + (n - 2) + " terminates");
return f1 + f2;
}
得到了:
fibo 4 calls fibo 3 and fibo 2
fibo 3 calls fibo 2 and fibo 1
fibo 2 calls fibo 1 and fibo 0
fibo 1 terminates
fibo 0 terminates
fibo 2 terminates
fibo 1 terminates
fibo 3 terminates
fibo 2 calls fibo 1 and fibo 0
fibo 1 terminates
fibo 0 terminates
fibo 2 terminates
如您所见,基本情况的终止序列是1 0 1 1 0。
答案 1 :(得分:0)
您没有指定语言,因此当您在一行上进行两次调用时,无法保证调用的顺序。有些语言或编译器会指定他们会做什么,有些则不会。
假设从左到右评估,我将事情分解为使用print语句的显式调用,以明确显示事情发生的位置。由于没有指定语言,我在Ruby中做了这个:
def fib(n)
return n if n <= 1
puts "fib(#{n}) calls fib(#{n-1})"
f1 = fib(n-1)
puts "fib(#{n-1}) returns to fib(#{n})"
puts "fib(#{n}) calls fib(#{n-2})"
f2 = fib(n-2)
puts "fib(#{n-2}) returns to fib(#{n})"
f1 + f2
end
它产生了以下输出:
irb(main):011:0> fib(4)
fib(4) calls fib(3)
fib(3) calls fib(2)
fib(2) calls fib(1)
fib(1) returns to fib(2)
fib(2) calls fib(0)
fib(0) returns to fib(2)
fib(2) returns to fib(3)
fib(3) calls fib(1)
fib(1) returns to fib(3)
fib(3) returns to fib(4)
fib(4) calls fib(2)
fib(2) calls fib(1)
fib(1) returns to fib(2)
fib(2) calls fib(0)
fib(0) returns to fib(2)
fib(2) returns to fib(4)
=> 3
我认为很清楚正在做什么,以什么顺序。