<p>一些问题:</p>
<ul>
<li>第一个函数被第二个函数覆盖,因此实际上只使用第二个函数。因此,没有发生回忆录</li>
<li>赋值说明您的函数应该接受一个数组,但您提供了一个集合<code>{2, 3}</code>是Python中的一个集合,而<code>[2, 3]</code>是一个列表</李>
</ul>
<p>如果使用了第一个功能:</p>
<ul>
<li>它有一个实际需要的注释行</李>
<li>它接受一个用<code>={}</code>初始化一次(仅一次!)的参数。这意味着如果主代码进行多个调用(如示例中所示),<code>memo</code>将不会在调用之间重置,因此结果将是错误的</李>
</ul>
<p>因此,为第一个函数使用不同的名称,并删除<code>memo</code>的初始值。避免在第二个函数中重复代码,让它调用第一个函数,确保它传递一个空的<code>memo</code>字典:</p>
<pre><code>def howSumRec(target_num, listt, memo):
if target_num in memo:
return memo[target_num]
if target_num == 0:
return []
if target_num < 0:
return None
for num in listt:
remainder = target_num - num
remainder_result = howSumRec(remainder, listt, memo)
if remainder_result is not None:
memo[target_num]= *remainder_result, num
return memo[target_num]
memo[target_num] = None
return None
def howSum(target_num, listt):
return howSumRec(target_num, listt, {})
</code></pre>
<p>如果需要,您仍然可以对此进行改进,因为这没有利用添加术语的<em>顺序</em>并不重要这一事实。因此,您可以确保递归调用不会查看列表中比添加的上一个术语更早的术语:</p>
<pre><code>def howSumRec(target_num, listt, i, memo):
if target_num in memo:
return memo[target_num]
if target_num == 0:
return []
if target_num < 0:
return None
for j in range(i, len(listt)):
num = listt[j]
remainder = target_num - num
remainder_result = howSumRec(remainder, listt, j, memo)
if remainder_result is not None:
memo[target_num]= *remainder_result, num
return memo[target_num]
memo[target_num] = None
return None
def howSum(target_num, listt):
return howSumRec(target_num, listt, 0, {})
</code></pre>
<p>重要的是,在这个版本中,<code>listt</code>实际上是一个列表,而不是一个集合,因此将其称为:</p>
<pre><code>print(howSum(7, [2, 3]))
print(howSum(7, [5, 3, 4, 7]))
print(howSum(7, [2, 4]))
print(howSum(8, [2, 3, 5]))
print(howSum(300, [7, 14]))
</code></pre>