我有多个数字范围,如[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
...
感谢。
答案 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)。