Вы должны объединить каждый результат из рекурсивного (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]]
Эти типы комбинаторных c функций, однако, обычно определяются как генераторы, так что результаты могут обрабатываться без необходимости генерировать и хранить все значения в большом списке:
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)
[EDIT] Вы можете обобщить это далее, предоставив (переменные) размеры диапазона в качестве параметров:
def multiRange(n,*rest):
for i in range(n):
for r in multiRange(*rest) if rest else [tuple()]:
yield (i,)+r
output:
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)
это было бы полезно, чтобы получить все координаты многомерной матрицы (или списка списков)
Может использоваться с распаковкой параметров для вашего конкретного примера c:
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)