【问题标题】:Memoization python [closed]记忆python [关闭]
【发布时间】:2014-01-13 19:10:34
【问题描述】:

什么是memoization,它是如何在python中使用的?以及它与递归有何不同。 在某处我遇到了一条语句,即为了减少递归程序或函数的执行时间,我们应该使用记忆化而不是递归。例如:

def factorial( n ):
   if n <1:   # base case
       return 1
   else:
       return n * factorial( n - 1 )  # recursive call

如果这是一个计算阶乘的递归函数,使用 memoization 会有什么变化?

【问题讨论】:

    标签: python recursion memoization


    【解决方案1】:

    记忆是存储结果以备将来使用。 Python 的 functools 模块包括一个简单的装饰器lru_cache,它会为您处理这个问题。所以对于你的例子:

    @lru_cache(maxsize=None)
    def factorial( n ):
       ...
    

    将存储阶乘的每个结果,包括它的递归调用。这意味着下次您调用阶乘时,您将不会执行完整的计算,而是会在您到达之前调用过的调用时立即停止。届时,将从之前存储的结果中提取结果。

    这些答案也可能对您有用: What is memoization and how can I use it in Python?

    【讨论】:

      【解决方案2】:

      如果一个函数是纯函数,那么它总是会给出相同的输入。我们可以通过记住执行函数的结果来利用这一点,从而节省诸如阶乘之类的昂贵函数的工作。结果如下所示:

      factorialAns = {}
      def factorial( n ):
         global factorialAns
         if n in factorialAns:
              return factorialAns[n]
         if n <1:   # base case
             return 1
         else:
             factorialAns[n] = n * factorial( n - 1 )  # recursive call
             return factorialAns[n]
      

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 2021-08-05
        • 2013-05-04
        • 2012-12-20
        • 1970-01-01
        相关资源
        最近更新 更多