【问题标题】:How to generate all combinations of ranges of numbers [closed]如何生成数字范围的所有组合[关闭]
【发布时间】:2016-01-08 16:33:52
【问题描述】:

我有多个数字范围,例如 [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
...

谢谢。

【问题讨论】:

  • 对于递归实现来说似乎是一个自然问题。
  • 如果范围数固定且很小,则用于嵌套循环。
  • 您对此有什么想法吗?你有没有尝试过?
  • 是的,我曾想过。但是范围的数量是可变的这一事实阻碍了我。
  • 正如@kfx 所写:递归解决方案 - 也许某个善良的灵魂会发布一些代码来为您省去麻烦,但您应该真正自己解决。将数组指针、索引、最大索引和值范围数组作为函数参数传递。

标签: python c algorithm combinations


【解决方案1】:

这必须是递归的。 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 的调用中扩展。如果你只有最大值和最小值,你可以编写一个辅助函数来扩展范围,然后调用variads

【讨论】:

  • 尽管这不是 C 语言,但它完美地展示了算法,所以我喜欢这个答案
  • 是的,OP 仍然需要尝试自己的代码。
  • 糟糕,没看到。我已经看到 Python 很简洁,并且通常很好地展示了算法(因此更容易编写和阅读)。在 C/C++ 中,很多时候在创建/初始化/声明列表的代码中会丢失很多清晰度。所以我喜欢使用 python 来提供工作代码和显示使用的方法。
  • 谢谢,这很有道理!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多