如何生成数字范围的所有组合

时间:2016-01-08 16:33:53

标签: python c algorithm combinations

我有多个数字范围,如[1-> 5],[1-> 3]和[1-> 2]。范围和边界的数量是可变的。

什么是算法(理想情况下是c代码)来生成所有可能的组合,例如例如上面:
1 - 1 - 1
1 - 1 - 2
1 - 2 - 1
1 - 2 - 2
1 - 3 - 1
1 - 3 - 2
2 - 1 - 1
...

感谢。

2 个答案:

答案 0 :(得分:4)

这必须是递归的。 python中的示例代码是:

def variads(lst, lstsofar):
    offset = len(lstsofar)
    outerlen = len(lst)
    innerLst = lst[offset]
    printit = False
    if offset == (outerlen - 1):
        printit = True
    for item in innerLst:
        if printit:
            print (lstsofar + [item])
        else:
            variads(lst, lstsofar + [item])
    return

要调用此方法,您需要传递一个列表列表:

>>> variads([[1, 2, 3, 4, 5], [1, 2, 3], [1, 2]], [])
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
[1, 2, 2]
[1, 3, 1]
[1, 3, 2]
[2, 1, 1]
[2, 1, 2]
[2, 2, 1]
[2, 2, 2]
[2, 3, 1]
[2, 3, 2]
[3, 1, 1]
[3, 1, 2]
[3, 2, 1]
[3, 2, 2]
[3, 3, 1]
[3, 3, 2]
[4, 1, 1]
[4, 1, 2]
[4, 2, 1]
[4, 2, 2]
[4, 3, 1]
[4, 3, 2]
[5, 1, 1]
[5, 1, 2]
[5, 2, 1]
[5, 2, 2]
[5, 3, 1]
[5, 3, 2]

以上将处理可变数量的范围。在variads的调用中扩展了范围。如果您只有max和min,则可以编写辅助函数来扩展范围,然后调用variads

答案 1 :(得分:0)

您可能希望将heaps algorithm视为一种方法。另外,Knuth有一个专门用于组合学的卷(4b IIRC)。