【问题标题】:why doesn't memoization work in this Python code?为什么这个 Python 代码中的 memoization 不起作用?
【发布时间】:2020-12-21 14:13:18
【问题描述】:

我正在关注动态编程视频。但是,我的代码的记忆不起作用。当我打印(备忘录)它是空白时,它不存储任何真/假。请指教

def cansum(targetsum,numbers):
      memo = dict()
      print(memo)
      # check in memory
      if targetsum in memo:
            return memo[targetsum]
      if targetsum < 0: return False
      if targetsum == 0: return True
      for number in numbers:
            remainder = targetsum - number
            if cansum(remainder,numbers) == True:
                  memo[targetsum] = True
                  return True
      memo[targetsum] = False
      return False


print(cansum(7,[2,3])) #True
print(cansum(7,[5,3,4,7])) #True

【问题讨论】:

  • 对于初学者来说,每次调用cansummemo = dict() 这一行都会清除字典..
  • 哦,好的,将 memo= dict 移到 def 工作之外。谢谢
  • 您没有在递归中将“备忘录”作为参数传递给cansum()(在视频中就是这样做的,通过用def cansum(targetsum, numbers, memo = {}) 定义cansum 然后执行递归调用为cansum(remainder, numbers, memo)

标签: python memoization


【解决方案1】:

我认为这是您可能想要做的:

def cansum(targetsum, numbers):
    memo = dict()

    def cansum_helper(targetsum, numbers):
        # check in memory
        if targetsum in memo:
            return memo[targetsum]
        if targetsum < 0:
            return False
        if targetsum == 0:
            return True
        for number in numbers:
            remainder = targetsum - number
            if cansum_helper(remainder, numbers) == True:
                memo[targetsum] = True
                return True
        memo[targetsum] = False
        return False

    result = cansum_helper(targetsum, numbers)

    print(memo)

    return result


print(cansum(7, [2, 3]))  # True
print(cansum(7, [5, 3, 4, 7]))  # True

如果你放

memo = dict()

进入递归函数,你为每个递归函数创建一个字典,一旦设置了备忘录,return 语句就会跟随,所以你将无法看到更改。但其目的是您的整个函数只需要一个 dict。

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 2019-12-11
    • 2016-07-02
    • 2019-12-02
    • 2018-11-05
    • 2012-02-22
    • 2023-03-03
    • 2017-10-02
    • 2016-07-10
    相关资源
    最近更新 更多