【发布时间】:2014-11-16 18:42:06
【问题描述】:
所以我遇到了一个奇怪的问题。
def findFourPlus(itemCount, seq, goal):
goalDifference = float("inf")
closestPartial = []
hello = subset_sum(itemCount, seq, goal, goalDifference, closestPartial, partial=[])
return hello #doesn't return value from subset_sum()
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("FOUND YAA")
return partial #right now doesn't return anything. I intend for it to break out of this function as soon as it finds one pair of solution.
else:
if( abs(goal - s) < goalDifference):
#print(abs(goal-s), goalDifference, closestPartial)
goalDifference = abs(goal - s)
closestPartial[:] = partial
#print(abs(goal-s), goalDifference, closestPartial)
return closestPartial
for i in range(len(seq)):
n = seq[i]
remaining = seq[i+1:]
print(subset_sum(itemCount, remaining, goal, goalDifference, closestPartial, partial + [n]))
在subset_sum()函数中,我可以打印出partial变量,它会返回给我正确的值
>>> findFourPlus(3, [1,2,3,4,5,6,7,8,9,10], 20)
FOUND YAA
[1, 9, 10]
FOUND YAA
[2, 8, 10]
FOUND YAA
[3, 7, 10]
FOUND YAA
[3, 8, 9]
FOUND YAA
[4, 6, 10]
FOUND YAA
[4, 7, 9]
FOUND YAA
[5, 6, 9]
FOUND YAA
[5, 7, 8]
但是,如果我将 print(partial) 行更改为 return partial,它仍然会打印出 FOUNDYAA 行,因为它已打印,但不会返回部分
>>> findFourPlus(3, [1,2,3,4,5,6,7,8,9,10], 20)
FOUND YAA
FOUND YAA
FOUND YAA
FOUND YAA
FOUND YAA
FOUND YAA
FOUND YAA
FOUND YAA
我在编写 findFourPlus 和 subset_sum 之前编写了其他函数,当我尝试返回某些内容时,它们运行良好。我在这里做错了什么?
编辑:我似乎在这里混淆了读者。我最终要做的是通过调用 findFourPlus() 函数将整数集(列表)存储在变量中。假设我想看看,在列表 [1,2,3,4,5] 中,它们中的任何两个加起来是否等于 5,我会调用 findFourPlus(2, [1,2,3,4 ,5], 5),希望它会返回给我 [1, 4]。有了这个,我可以通过调用将答案 [1,4] 存储到一个变量中,比如说答案
answer = findFourPlus(2, [1,2,3,4,5], 5) // if I call answer, it'll return to me [1,4]
一个例子:
>>> a = findFourPlus(2, [1,2,3,4,5], 6) # prints out everything, which is good for test cases
[1, 2]
[1, 3]
[1, 4]
FOUND YAA
[1, 5]
None
[2, 3]
FOUND YAA
[2, 4]
[2, 5]
None
[3, 4]
[3, 5]
None
[4, 5]
None
None
>>> a # doesn't return anything when called
>>>
打印只是为了确保我的逻辑是正确的。很抱歉造成混乱,但希望这可以澄清它!
【问题讨论】:
-
所以我不完全确定你认为你的代码应该做什么,但它没有多大意义。即使您在
subset_sum中添加退货,也不能保证退货。最重要的是,if(len(partial) == itemCount)只有在您将 0 作为itemCount传递时才会为真,因为您总是为partial传递一个空列表。我建议你重新开始。 -
@user2085282 现在看起来确实是最好的做法,不是吗。有没有subset_sum问题的非递归方法?
-
你能修复subset_sum中的缩进吗?很难说它在做什么。另外,您可以将代码更新为返回失败的案例吗?很难从工作案例中找出问题所在。同时执行
print(partial)和return partial,并在 findFourPlus 中打印结果会有所帮助。 -
我已经更新了代码!如果您需要任何其他信息,请告诉我