为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕的地8271018 2022-10-05 17:51:30
我试图通过在递归函数中传递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 combinationsprint(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!作为一个初学者,我不知道如何处理这个问题。如果有人可以帮助我真的很感激!
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超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]]

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


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)


查看完整回答
反对 回复 2022-10-05
  • 1 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号