为什么在递归问题中添加备忘录会给出错误的结果,而删除备忘录会给出正确的答案?

Why adding memo in recursion problem gives wrong result while removing memo gives correct answer?

问。编写一个函数“canSum(target_sum, numbers)”,它接受一个 target_sum 和一个数字数组作为参数。该函数应该 return 一个布尔值,指示是否可以使用数组中的数字生成 target_sum。

这是我的解决方案,但它只在我删除记忆时有效。

    def canSum(target_sum, numbers, memo={}):
        if target_sum in memo:
           return memo[target_sum]
        if target_sum == 0:
            return True
        if target_sum < 0:
            return False

        for num in numbers:
           if canSum(target_sum - num, numbers, memo) == True:
               memo[target_sum] = True # removing this gives expected output.
               return True

        memo[target_sum] = False # removing this gives expected output.
        return False

   if __name__ == "__main__":
      print(canSum(7, [2, 5, 7])) # Output: True
      print(canSum(7, [2, 4])) # Output: True (while it should be false).
   

After removing memo, now it works correctly. Please help, I cant find why is this happening.

for num in numbers:
    if canSum(target_sum - num, numbers, memo) == True:
        return True

return False
# Now it works fine.
 

我终于找到了答案。 在之前的代码 canSum(target_sum, numbers, memo={} 中,memo 所有函数调用相同。

我的意思是 canSum(7, [2, 5, 7])canSum(7, [2, 4]) memo 两者相同。

因此,当它第二次调用该函数时,它会检查先前存储的密钥并根据它returns。

  if target_sum in memo:
       return memo[target_sum]

所有这些 ghop-chop 就是在这里发生的。

这是我更正后的代码。

  def canSum(target_sum, numbers):
       memo = {}
       return memoCanSum(target_sum, numbers, memo)


  def memoCanSum(target_sum, numbers, memo):
      if target_sum in memo:
          return memo[target_sum]
      if target_sum == 0:
          return True
      if target_sum < 0:
          return False

      for num in numbers:
          if memoCanSum(target_sum - num, numbers, memo) == True:
              memo[target_sum] = True
              return True

      memo[target_sum] = False
      return False


  if __name__ == "__main__":
      print(canSum(7, [2, 5, 7])) # Output: True
      print(canSum(7, [2, 4])) # Output: False
      print(canSum(9, [2, 4])) # Output: False

这里,创建了另一个函数 memoCanSum(target_sum, numbers, memo) 并从 canSum(target_sum, numbers) 调用它。现在每次调用 canSum 时,它都会正常工作,因为在每次调用中 memo 都设置为空。