【问题标题】:Recursion sequence - generic approach递归序列 - 通用方法
【发布时间】:2015-12-19 03:01:16
【问题描述】:

我们有以下斐波那契数的经典递归示例

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) 部分还是并行发生?

【问题讨论】:

  • 它们将按照写入的顺序依次进行评估。

标签: python recursion


【解决方案1】:

不,这两个计算将顺序进行,是的,这是计算斐波那契数列的一种非常浪费的方式。

一个不那么浪费的递归函数返回两个连续数字(当前和前一个):

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,效率更高。

【讨论】:

    【解决方案2】:

    首先计算 fib(n-1) 部分,然后计算 fib(n-2) 部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多