递归序列 - 通用方法

时间:2015-12-19 03:01:17

标签: python recursion

我们有斐波纳契数字的下面经典递归示例

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)部分或它们并行发生?

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)部分。