1 回答

TA貢獻1842條經(jīng)驗 獲得超13個贊
您必須將 recursive(n-1) 的每個結果與 [0] 和 [1] 結合起來:
這是一個使用兩級列表理解的示例:
def recursive(n):
if n == 1: return [[0],[1]]
return [ r+[b] for r in recursive(n-1) for b in [0,1] ]
print(recursive(3))
# [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]
然而,這些類型的組合函數(shù)通常被定義為生成器,這樣就可以處理結果,而不必在一個大列表中生成和存儲所有值:
def recursive(n):
if n == 1:
yield [0]
yield [1]
else:
for r in recursive(n-1):
yield r+[0]
yield r+[1]
for combo in recursive(3): print(combo)
[編輯]您可以通過提供(可變)范圍大小作為參數(shù)來進一步概括這一點:
def multiRange(n,*rest):
for i in range(n):
for r in multiRange(*rest) if rest else [tuple()]:
yield (i,)+r
輸出:
for x,y,z in multiRange(2,3,2):
print((x,y,z))
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(0, 2, 0)
(0, 2, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
(1, 2, 0)
(1, 2, 1)
這對于獲取多維矩陣(或列表列表)的所有坐標很有用
對于您的特定示例,它可以與參數(shù)解包一起使用:
for combo in multiRange(*[2]*3): print(combo)
(0, 0, 0)
(0, 0, 1)
(0, 1, 0)
(0, 1, 1)
(1, 0, 0)
(1, 0, 1)
(1, 1, 0)
(1, 1, 1)
添加回答
舉報