您的代码的主要问题是,列表all_distributions
最终包含许多对同一输入列表distribution
的引用。当您拨打all_distributions.append(distribution)
时,列表distribution
未被复制到列表all_distributions
中,但仅添加对该列表的引用。 all_distributions.append(list(distribution))
的最小修复你的代码是插入的副本,在基本情况下删除,和递归调用后加入distribution.pop()
:
all_distributions = []
def get_distributions(distribution, items):
if items == 0:
all_distributions.append(list(distribution))
else:
for i in range(1, items + 1):
distribution.append(i)
get_distributions(distribution, items - i)
distribution.pop()
get_distributions([], 3)
print(all_distributions)
输出您可以通过显式地将副本解决这个问题: [[1, 1, 1], [1, 2], [2, 1], [3]]
一个更好的办法是避免使用distribution.append
,而是使用加运算的名单,像这样:
def get_distributions(distribution, items):
if items == 0:
all_distributions.append(distribution)
else:
for i in range(1, items + 1):
d = distribution + [i]
get_distributions(d, items - i)
列表上的加号运算符通过连接两个给定列表来创建一个新列表。在这种情况下,我们将连接distribution
右侧的单个元素i
以获取包含distribution
后跟i
中的元素的新副本。
另一项改进是避免全局变量all_distributions
,而是返回分布的名单:
def get_distributions(distribution, items):
if items == 0:
return [distribution]
else:
all_distributions = []
for i in range(1, items + 1):
d = distribution + [i]
all_distributions += get_distributions(d, items - i)
return all_distributions
print(get_distributions([], 4))
输出:[[1, 1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 3], [2, 1, 1], [2, 2], [3, 1], [4]]
什么呢明确方法?列表没有这个属性 –
@PasqualGuerrero:在Python 3中存在'clear'方法。https://docs.python.org/3/tutorial/datastructures.html –