子集和与memoization

时间:2013-01-18 15:10:58

标签: python recursion sum subset memoization

对于家庭作业,我为子集求和写了一个递归函数,但我找不到我的字典的正确密钥,我一直都在得到关键错误。 不寻找解决方案,只是解释可以帮助我理解什么是worng:

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]

仍有问题,无法弄清楚原因

2 个答案:

答案 0 :(得分:0)

这是你的代码:

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]的值就不会设置。

答案 1 :(得分:0)

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