Algorithm 子集和算法与递归

Algorithm 子集和算法与递归,algorithm,recursion,subset,Algorithm,Recursion,Subset,经过一些研究,下面是我发现的子集和递归的一个修改版本。修改后的版本不仅尝试返回精确和(如果有),而且还尝试返回最接近的整数集(如果找不到精确和)。此外,还有一个列表大小要求,用于确定必须加多少个数字才能确定最终的总和 def findFourPlus(itemCount, seq, goal): goalDifference = float("inf") closestPartial = [] subset_sum(itemCount, seq, goal, goalDi

经过一些研究,下面是我发现的子集和递归的一个修改版本。修改后的版本不仅尝试返回精确和(如果有),而且还尝试返回最接近的整数集(如果找不到精确和)。此外,还有一个列表大小要求,用于确定必须加多少个数字才能确定最终的总和

def findFourPlus(itemCount, seq, goal):
    goalDifference = float("inf")
    closestPartial = []
    subset_sum(itemCount, seq, goal, goalDifference, closestPartial, partial=[])
    print(closestPartial)

def subset_sum(itemCount, seq, goal, goalDifference, closestPartial, partial):
s = sum(partial)

# check if the partial sum is equals to target
if(len(partial) == itemCount):
    if s == goal:
            print(partial)
    else:
        if( abs(goal - s) < goalDifference):
            goalDifference = abs(goal - s)
            closestPartial = partial        

for i in range(len(seq)):
    n = seq[i]
    remaining = seq[i+1:]
    subset_sum(itemCount, remaining, goal, goalDifference, closestPartial, partial + [n])
我现在面临的问题是closesetPartial始终是一个空列表,因为subset_sum的每次调用都会将ClosestPartial刷新回一个空列表。我试图将goalDifference和cloestPartial初始化移到subset_sum函数之外,但返回时引用了赋值错误之前的局部变量goalDifference


我该怎么做才能既保留递归算法,又能跟踪到目前为止最接近的和?还有更好的方法解决这个问题吗?

在调用subset_sum之外初始化closestPartial和goalDifference,并将它们作为参数传递进来。要么维护一个通过引用传递给每个子集和调用的ClosesPartial,要么将ClosesPartial的副本传递给每个子集和调用-前者可能更有效,而后者更容易实现/解释,因为它没有副作用。

嗨,谢谢你的建议。我已经编辑了上面的算法,但现在它返回了TypeError:subset_sum缺少2个必需的位置参数:“closestPartial”和“partial”,我不明白,因为我已经定义了closestPartial,partial是默认参数只是开玩笑,似乎我忘记了底部的subset_sum递归调用。上述算法仍然只返回一个空的closestpartial列表。知道为什么吗?@user3277633我想现在发生的是,您正在将closestPartial引用更改为指向部分引用,但是外部函数没有看到这一点-它仍然有一个对原始closestPartial的引用,而不是更新的引用。您可以逐个元素将部分元素复制到closestPartial,或者可以包装closestPartial并传递包装器,例如struct wrapper{closestPartial[]}-然后,当您更新包装器内的引用时,外部函数将看到更新的引用。我已尝试设置cloestPartial=listpartial或closestPartial=copy.copypartial,但两者都不起作用。我想知道我打电话背后的逻辑是否正确?