经过一些研究,下面是我在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;在分配前引用错误。
到目前为止,我如何保持递归算法同时跟踪最接近的和?是否有更好的方法来解决这个问题?
答案 0 :(得分:0)
在closestPartial
调用之外初始化goalDifference
和subset_sum
,并将其作为参数传递。通过引用每个closestPartial
调用来维护单个subset_sum
,或者将closestPartial
的副本传递给每个subset_sum
调用 - 前者可能会更高效,后者将更容易实施/推理,因为它没有副作用。