我是Python的新手,所以这可能是一个愚蠢的问题。
我实现了一个简单的递归背包解决方案,最终返回一个比特序列。但有时它不会返回生成的序列。这是我的代码及其不同输入的结果。
def knapsackRecursive(items, maxNum, bestResponse):
print('items=' + str(items) + ', maxNum=' + str(maxNum))
referenceIndex = 0
editableMaxNum = maxNum
if editableMaxNum == 0:
bestResponse = '0'
else:
for i in reversed(items):
item = int(i)
if editableMaxNum >= item:
if referenceIndex == 0:
referenceIndex = items.index(str(item))
editableMaxNum -= item
bestResponse = '1' + bestResponse
else:
bestResponse = '0' + bestResponse
if editableMaxNum != 0:
bestResponse = ''
if referenceIndex != 0:
for k in range(0, len(items) - referenceIndex):
bestResponse = '0' + bestResponse
knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)
else:
bestResponse = '0'
print('bestResponse=' + str(bestResponse))
return bestResponse
Items
是常数['1'、'2'、'4'、'10'、'20'、'40'、'63'、'105']。也是首字母
bestResponse
是空字符串。
如果我设置
maxNum
作为41,输出为:
items=['1', '2', '4', '10', '20', '40', '63', '105'], maxNum=41
bestResponse=10000100
但如果我设置
最大数量
输出为71:
items=['1', '2', '4', '10', '20', '40', '63', '105'], maxNum=71
items=['1', '2', '4', '10', '20', '40'], maxNum=71
bestResponse=10011100
bestResponse=00
为什么
最佳反应
为输入71打印两次输出?尽管第一次打印是正确的,但为什么函数会返回第二个错误的结果?
编辑
我已经改变了
knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)
像
return knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)
。似乎解决了。显然,我在使用递归时犯了一个错误。但我仍然不明白为什么函数返回第一次调用的结果,而不是第二次调用,因为预期第二次会生成正确的响应。