您的代碼的主要問題是,列表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 –