如何使用递归实现这段python代码



我正试图找到一种递归方法来实现这一点,方法是在递归函数中为循环传递的数量:

def non_recursive():
combinations = []
for i in range(2): # first character
for j in range(2): # second character
for k in range(2): # third character
combinations.append([i, j, k])
return combinations
print(non_recursive())

输出:

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

在本例中,使用了循环的3个。递归方式的函数原型应该是这样的:

def recursive(number_of_iterations): # number of iterations = length of each list
# implementation goes here!

作为一个初学者,我不知道如何处理这个问题。如果有人能帮忙,我真的很感激!

您必须将递归(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]]

然而,这些类型的组合函数通常被定义为生成器,这样就可以处理结果,而不必生成并将所有值存储在一个大列表中:

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

输出:

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)

这将有助于获得多维矩阵(或列表列表(的所有坐标

它可以用于特定示例的参数拆包:

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)

最新更新