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

我试图通过在递归函数中传递for循环的数量来找到一种递归方式:


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 个for循环。递归方式的函数原型应如下所示:


def recursive(number_of_iterations): # number of iterations = length of each list

  # implementation goes here!

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


慕的地8271018
浏览 178回答 1
1回答

红颜莎娜

您必须将 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]]然而,这些类型的组合函数通常被定义为生成器,这样就可以处理结果,而不必在一个大列表中生成和存储所有值: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)[编辑]您可以通过提供(可变)范围大小作为参数来进一步概括这一点: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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python