如何通过能够递归地多次使用数字来创建n个数字的所有组合[重复]

Posted

技术标签:

【中文标题】如何通过能够递归地多次使用数字来创建n个数字的所有组合[重复]【英文标题】:how to create all combinations of n numbers by being able to use numbers multiple times recursively [duplicate] 【发布时间】:2022-01-19 23:34:48 【问题描述】:

例如,我有数字 0 和 255。我想要看起来像这样的组合

[[0, 0], [0, 255], [255, 0], [255, 255]]

我当前的代码如下所示,其中“a”是数字列表,可能是 2 或更多。

def combinations(a):
    if len(a) == 0:
        return [[]]
    final = []
    for i in combinations(a[1:]):
        final += [i, i+[a[0]]]
    return final

但它反而给出了这个输出 [[], [0], [255], [255, 0]]

我正在寻找一种在不使用任何库的情况下递归解决它的方法。

【问题讨论】:

如果您的列表是 [0, 255] 那么 [0,0] 和 [255, 255] 不是该列表中的组合 @d_kennetz 那么他们叫什么 函数可以接收任意大小的列表吗? @EduardoTolmasquim 是的,这意味着组合的数量可能会很大。 所以返回的列表的大小与可能值的列表的大小相同吗?还是在您的示例中这纯粹是巧合? 【参考方案1】:

您可以为此使用 itertools:

from itertools import product
lst = [0, 255]
[p for p in product(lst, repeat=2)]
# [(0, 0), (0, 255), (255, 0), (255, 255)]

由于不想导入库,也可以查阅itertools的文档,直接使用函数:

def product(*args, repeat=1):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = [tuple(pool) for pool in args] * repeat
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)


lst = [0, 255]
[p for p in product(lst, repeat=2)]

【讨论】:

以上是关于如何通过能够递归地多次使用数字来创建n个数字的所有组合[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中创建一个通过递归减少n的函数

递归产生数

如何计算整数中递归地与给定数字相加的数字对

uva 10479(找规律+递归)

打印可以等于给定数字的所有 3 个连续数字

递归1.2用递归函数来实现获取斐波拉契数列中第n个数字的值