【问题标题】:subset sum with memoization带有记忆的子集和
【发布时间】:2013-01-18 15:10:58
【问题描述】:

为了家庭作业,我为子集总和编写了一个递归函数,但我找不到字典的正确键,我一直收到键错误。 不是在寻找解决方案,只是可以帮助我理解磨损的解释:

def subset_sum(s, numbers):
    memo={}
    return subset_sum_memo(s, numbers, 1, memo)

def subset_sum_memo(s, numbers, i, memo):
    key= (len(numbers))
    if key not in memo:
        if s==0:
            memo[key]= True
        elif s<0 or numbers==[]:
            memo[key]= False
        for n in range(len(numbers)):
            if subset_sum_memo(s - numbers[n], numbers[:n] + numbers[n+1:], n, memo):
                memo[key]= True
    return memo[key]

我得到的错误是:

if subset_sum_memo(s - numbers[n], numbers[:n] + numbers[n+1:], n, memo): 
File "C:\Users\Yarden\Desktop\Python\302154513_ex11_q1.py", line 17, in subset_sum_memo return memo[key] KeyError: 6

更新 1

这是我的新代码:

def subset_sum(s, numbers):
    memo={}
    return subset_sum_memo(s, numbers, 1, memo)


def subset_sum_memo(s, numbers, i, memo):
    key= (len(numbers))
    if s==0:
        memo[key]= True
    if s<0 or numbers==[]:
        memo[key]= False
    if key not in memo:
        for n in range(len(numbers)):
            if subset_sum_memo(s - numbers[n], numbers[:n] + numbers[n+1:], n, memo):
                memo[key]= True
            else:
                memo[key]=False
    return memo[key]

还是有问题,不知道为什么

【问题讨论】:

  • 错误说明了什么?可以发一下吗?
  • 如果 subset_sum_memo(s - numbers[n], numbers[:n] + numbers[n+1:], n, memo): 文件 "C:\Users\Yarden\Desktop\Python\ 302154513_ex11_q1.py",第 17 行,在 subset_sum_memo 返回 memo[key] KeyError: 6
  • 在您的 for 循环中,有时 memo[key] 未设置,因为它受 if 语句的限制。在这些情况下,当您尝试在 return 语句中访问 memo[key] 时会收到 KeyError。
  • 顺便说一句,Python 中的记忆需要一个装饰器。 code.activestate.com/recipes/…

标签: python recursion sum subset memoization


【解决方案1】:

这是你的代码:

if key not in memo:
    if s==0:
        memo[key]= True
    elif s<0 or numbers==[]:
        memo[key]= False
    for n in range(len(numbers)):
        if subset_sum_memo(s - numbers[n], numbers[:n] + numbers[n+1:], n, memo):
            memo[key]= True
return memo[key]

问题是,您正在检查key 是否不在memo 中并进入块。那么你有多个条件但不是默认情况。

如果所有条件都是false,则不会为memo[key]设置值。

【讨论】:

  • 我想我明白了,我从“如果键不是...”中去掉了条件,但仍然出现同样的错误。
  • 您必须确保在函数返回之前设置了memo[key]
  • 还添加了“else: memo[key]=False”,在我的 doctest 上仍然出现不同的错误:TEST: s = 64 and numbers = [23, 40, 20, 6, 3, 12, 20, 21, 18, 17] : FAILURE 预期为真,结果为假
  • 要正确编程,您必须正确思考,分开职责,对于列表中的数字,如果缓存中的数字则返回,如果没有则计算并添加到缓存中。就是这样。
  • def subset_sum(s, numbers): memo={} return subset_sum_memo(s, numbers, 1, memo) def subset_sum_memo(s, numbers, i, memo): key= (len(numbers) ) if s==0: memo[key]= True if s
【解决方案2】:

elif s&lt;0 or numbers==[]: 更改为 elif s&lt;0 or isinstance(numbers,list):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2011-02-04
    • 2016-03-30
    • 2018-04-01
    相关资源
    最近更新 更多