【问题标题】:Why does howSum solution work in Javascript but not in Python? (Dynamic programming)为什么 howSum 解决方案在 Javascript 中有效,但在 Python 中无效? (动态编程)
【发布时间】:2021-10-01 06:23:21
【问题描述】:

这是对 Stack Overflow 上this question 的跟进。

编写一个函数“howSum(targetSum, numbers)”,它接受一个 targetSum 和一个数字数组作为参数。

该函数应该返回一个数组,其中包含任何元素的组合,这些元素的总和正好是 targetSum。

如果没有组合到 targetSum,则返回 None。如果可能有多种组合,您可以返回任何一种。

我的解决方案的记忆python代码如下:

def howSum(targetSum, nums, memo = None):

    if memo is None:
        memo = {}
        
    if targetSum in memo: return memo[targetSum]
    if targetSum < 0: return None
    if targetSum == 0: return []
    
    for num in nums:
        remainder = targetSum - num
        remainderResult = howSum(remainder, nums)
        
        if remainderResult is not None:
            remainderResult.append(num)
            memo[targetSum] = remainderResult
            return memo[targetSum]
        
    memo[targetSum] = None
    return None

print(howSum(7, [2, 3])) # [3,2,2]
print(howSum(7, [5, 3, 4, 7])) # [4,3]
print(howSum(7, [2, 4])) # None
print(howSum(8, [2, 3, 5])) # [2,2,2,2]
print(howSum(300, [7,14]) # None

该算法有效,但对于最终测试用例而言效率不高。实际上,运行时效率与蛮力解决方案没有什么不同。有什么问题?

【问题讨论】:

  • 请包括您的运行时间,您是否也没有严格根据总和进行记忆(即使传递了不同的序列)?如果您在如此小的数组上对其进行测试,那么无论算法如何,都可能不会察觉到运行时差异。

标签: javascript python python-3.x dynamic-programming memoization


【解决方案1】:

当你递归调用它时只需传递备忘录

def howSum(targetSum, nums, memo = None): 

if memo is None:
    memo = {}
    
if targetSum in memo: return memo[targetSum]
if targetSum < 0: return None
if targetSum == 0: return []

for num in nums:
    remainder = targetSum - num
    remainderResult = howSum(remainder, nums , memo ) #pass memo as well
    
    if remainderResult is not None:
        remainderResult.append(num)
        memo[targetSum] = remainderResult
        return memo[targetSum]
    
memo[targetSum] = None
return None

【讨论】:

  • 问题,为什么我不能直接在参数中传递 memo = {} 作为 def howSum(targetSum, nums, memo = {})
【解决方案2】:

您似乎没有将 memo 值传递给递归的 howSum(remainder, nums) 调用,因此您失去了在那里记忆的好处。

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 2015-09-12
    • 2017-06-25
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多