子集和算法和递归

时间:2014-09-21 22:11:10

标签: algorithm recursion subset

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

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()都会刷新 cloestPartial 回到空列表。我尝试在subset_sum函数之外移动 goalDifference cloestPartial 初始化,但我返回局部变量&#39; goalDifference&#39;在分配前引用错误。

到目前为止,我如何保持递归算法同时跟踪最接近的和?是否有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

closestPartial调用之外初始化goalDifferencesubset_sum,并将其作为参数传递。通过引用每个closestPartial调用来维护单个subset_sum,或者将closestPartial的副本传递给每个subset_sum调用 - 前者可能会更高效,后者将更容易实施/推理,因为它没有副作用。