我们有斐波纳契数字的下面经典递归示例
def fib(n):
assert type(n) == int & n >= 0
if n == 0 or n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
fib(5) #=> 8
当我们调用fib(5)时,执行代码时会有一个序列,其中fib()fcn的最后一行中的fib(n-1)和fib(n-2)将被执行 - 即。先询问是否首先调用fib(n-1)部分,等待返回,然后是fib(n-2)部分或它们并行发生?
答案 0 :(得分:2)
不,两次计算都是按顺序进行的,是的,这是计算斐波那契数列的一种非常浪费的方法。
一个不太浪费的递归函数返回两个连续数字(当前和之前):
def fib2(n):
if n == 1:
return (0, 1)
else:
prev_1, prev_2 = fib2(n-1)
return (prev_1 + prev_2, prev_1)
def fib(n):
value, _ = fib2(n)
return value
更好的方法uses matrix exponentiation,效率更高。
答案 1 :(得分:1)
首先计算fib(n-1)部分,然后计算fib(n-2)部分。