【问题标题】:Naive Recursion faster then Memoized recursion朴素递归比记忆递归更快
【发布时间】:2020-12-04 21:41:57
【问题描述】:

我是 python 的初学者,正在关注this 学习动态编程的视频。 对于求斐波那契数列的案例,导师引入了memoization来提升递归算法的性能。 完整代码如下

    import time

def fibonacci1(n):
    '''This uses the naive fibonacci algorithm. '''
    if n < 2:
        return n
    else:
        return fibonacci1(n-1) + fibonacci1(n-2)

def fibonacci2(n):
    ''' This function uses a memo of computed values to speed up the process'''
    memo = {}
    if n in memo:
        return memo[n]
    if n < 2:
        return n
    f = fibonacci2(n-1) + fibonacci2(n-2)
    memo[n] = f
    return f

def screen(i,N):
    if i==1:
        return fibonacci1(N)
    if i == 2:
        return fibonacci2(N)

N = int(input("Enter a number: "))

for i in range(2):
    t0 = time.time()
    fib = screen(i+1,N)
    print("The "+ str(N) +"th fibonacci number is {}".format(fib))
    t1 = time.time()
    print("Time taken is : {}s".format(t1-t0))

但这是我收到的输出: FibonacciOutput

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: python recursion optimization dynamic-programming memoization


    【解决方案1】:

    fibonacci2(n) 函数之外将memo = {} 声明为全局 变量,因为当您在 fibonacci2() 中声明 memo 时,函数调用时它将始终初始化为空。你可以这样做

    memo = {}
    def fibonacci2(n):
        ''' This function uses a memo of computed values to speed up the process'''
       
        if n in memo:
            return memo[n]
        if n < 2:
            return n
        f = fibonacci2(n-1) + fibonacci2(n-2)
        memo[n] = f
        return f
    

    【讨论】:

      【解决方案2】:

      来自您的代码:

          memo = {}
          if n in memo:
      

      n 怎么可能在你之前创建的空字典中?

      我会这样做:

      def fibonacci2(n, memo={}):
          ...
      

      【讨论】:

        【解决方案3】:

        看起来它每次调用 fibonacci2 时都会将 memo 重置为空字典。因此,它增加了一些执行 dict 读取和写入的开销,但实际上并没有为算法添加记忆。如果您只是将 memo = {} 向上移动几行,使其值保持不变,它似乎会有所帮助。

        【讨论】:

          【解决方案4】:

          这里发生的情况是,您的 memo 是一个局部变量,您在每次运行 fibonacci2 时都为其分配了一个空字典。因此,您永远不会在memo 中找到n

          有多种方法可以完成您想做的事情。其中之一(不是最好的,但至少易于理解)是使用全局变量:

          memo = {}
          def fibonacci2(n):
              ''' This function uses a memo of computed values to speed up the process'''
              global memo
              if n in memo:
                  return memo[n]
              if n < 2:
                  return n
              f = fibonacci2(n-1) + fibonacci2(n-2)
              memo[n] = f
              return f
          

          这里我们在函数之外定义了memo,所以它只被定义一次。 global memo 行表明我们在函数中使用的 memo 实际上是在函数外部定义的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-11-12
            • 2012-09-27
            • 1970-01-01
            • 1970-01-01
            • 2018-09-08
            • 1970-01-01
            • 2015-05-03
            • 1970-01-01
            相关资源
            最近更新 更多