<p>除了注释中列出的问题(即可变默认参数,使用内置名作为变量名)之外,如果传递<code>memo</code>参数(EDIT:实际上想想看,无论如何都会发生这种情况),您还会遇到浅副本</p>
<p>对所有提到的问题进行最快的修复,只需进行最小的更改,就可以解决这个问题</p>
<pre><code>def bestsum(s, numbers, memo=None):
if memo is None:
memo = {}
if s == 0:
return []
elif s < 0:
return False
else:
if s not in memo:
shortest_combination = False
for number in numbers:
remainder = s - number
combination = bestsum(remainder, numbers, memo)
if combination != False:
combination = combination.copy()
combination.append(number)
if shortest_combination == False or len(combination) < len(shortest_combination):
shortest_combination = combination
memo[s] = shortest_combination
return memo[s]
</code></pre>
<p>(这并不是说这是最优雅的方式,更像是对代码的直接修复)</p>
<p>至于我会怎么做:</p>
<pre><code>def bestsum(s, numbers):
sums = {0:[]}
while(s not in sums and len(sums)>0):
sums = {k+n:l+[n] for k,l in sums.items() for n in numbers if k+n<=s}
if(s not in sums):
return None
else:
return sums[s]
</code></pre>