Mar*_*ere 6 javascript python dynamic-programming python-3.x
我正在关注有关动态编程的本教程,并且正在努力在以下问题中实现记忆:
*编写一个函数canSum(targetSum, numbers),该函数True仅在数组中的数字总和可以达到目标总和时才返回。数组中的所有数字都是正整数,您可以多次使用它们来求解。
例子:
canSum(7, [2, 4]) -> False 因为你不能通过添加 2 和 4 来形成 7。*
我的蛮力解决方案如下:
def canSum(targetSum, numbers):
if targetSum == 0:
return True
if targetSum < 0:
return False
for n in numbers:
remainder = targetSum - n
if canSum(remainder, numbers):
return True
return False
print(canSum(7, [2, 3])) # True
print(canSum(7, [5, 3, 4, 7])) # True
print(canSum(7, [2, 4])) # False
print(canSum(8, [2, 3, 5])) # True
Run Code Online (Sandbox Code Playgroud)
效果很好,但如果我们记住余数的解决方案会更快(这在视频中的 1:28:03 分钟进行了解释)。我用 Python 做了以下事情,这正是讲师正在做的事情,但它只会返回True,我不知道为什么......
def canSum(targetSum, numbers, memo={}):
if targetSum in memo:
return memo[targetSum]
if targetSum == 0:
return True
if targetSum < 0:
return False
for n in numbers:
remainder = targetSum - n
if canSum(remainder, numbers, memo):
memo[targetSum] = True
return True
memo[targetSum] = False
return False
print(canSum(7, [2, 3]))
print(canSum(7, [5, 3, 4, 7]))
print(canSum(7, [2, 4]))
print(canSum(8, [2, 3, 5])) # All of them return True
Run Code Online (Sandbox Code Playgroud)
感谢@Jared Smith 分享的文章,我终于弄清楚了。
该问题是由 python 处理默认参数的方式引起的。来自文章:
在 Python 中,当在函数中传递可变值作为默认参数时,只要该值发生变化,默认参数就会发生变化。
我的memo字典每次通话都会发生变化。所以我简单地进行了更改memo=None并添加了一个检查以查看这是否是该函数的第一次调用:
def canSum(targetSum, numbers, memo=None):
if memo == None:
memo = {}
if targetSum in memo:
return memo[targetSum]
if targetSum == 0:
return True
if targetSum < 0:
return False
for n in numbers:
remainder = targetSum - n
if canSum(remainder, numbers, memo):
memo[targetSum] = True
return True
memo[targetSum] = False
return False
print(canSum(7, [2, 3])) # True
print(canSum(7, [5, 3, 4, 7])) # True
print(canSum(7, [2, 4])) # False
print(canSum(8, [2, 3, 5])) # True
print(canSum(3000, [7, 14])) # False -> Works fast with large inputs!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
287 次 |
| 最近记录: |