【问题标题】:Generate all possible pairings生成所有可能的配对
【发布时间】:2014-10-27 01:27:14
【问题描述】:

这是一个让我很困惑的递归问题。

我想为一系列数字生成所有配对。它们不必全部存储,只需至少生成一次。例如,对于0 1 2 3 4 5,这将是

(0 1) (2 3) (4 5)
(0 1) (2 4) (3 5)
(0 1) (2 5) (3 4)
(0 1) (3 4) (2 5)
(0 1) (3 5) (2 4)
(0 2) (1 3) (4 5)
(0 2) (1 4) (3 5)
etc.

如您所见,我的方法是使用第一个可用数字生成第一对(一开始是 0,使用 0 到 5),遍历所有剩余数字以创建第一对。然后,对于每一对,我用剩余的数字递归。所以如果我的配对是0 1,我会用2 3 4 5重复这个过程。

我的问题是我不知道如何将其实现为递归函数。我发现它必须保留所有解决方案的运行列表(以便可以找到一些东西),同时还必须附加较小的解决方案并将它们组合起来。这对我来说太复杂了,无法想象,因此对于方法或伪代码(尽可能简单)的任何帮助将不胜感激。

【问题讨论】:

  • 我不确定递归函数是否是生成对的正确工具。如果您不仅要生成对,还要生成 (0 2 4 5)(1 3 4) 等。您可以使用接受两个参数的递归函数:当前排列和剩余数字列表。
  • 您的规则不明确。首先,显然(0 1) (2 3) (4 5) 有效,但(0 1) (2 3) (5 4) 无效;正确的?此外,(0 1) (2 3) (4 5)(0 1) (4 5) (2 3) 不同;正确的?究竟是什么决定了有效配对?
  • @user2338816 前两个其实是一样的。我弄错了,你说的最后两个也是一样的。

标签: recursion pseudocode


【解决方案1】:

这是一些伪代码:

function allPairingsInSet(Array set) { 

    // assume all elements in set are unique and set.length() >= 2
    if(set.length() == 2) {
        return set;
    }

    // get all pairings containing first element
    Array pairingsWithFirstElement;
    for(int i = 1; i < set.length(); i++){
        pairingsWithFirstElement[i] = (set[0], set[i]);
    }

    // get subsequent pairings excluding the ones with the first element,
    // which we already have; then concatenate the arrays
    return pairingsWithFirstElement + allPairingsInSet(set.subArray(1, set.length()-1));
}

使用您提供的示例集(0, 1, 2, 3, 4, 5),此方法将遍历并查找包含该集第一个元素0 的所有配对。

[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]

然后它对子集(1, 2, 3, 4, 5) 做同样的事情,给出

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

这一直持续到集合仅包含两个元素的基本情况,这只能产生一个可能的配对。在这种情况下,基本情况返回我们

(4, 5)

然后,在最后的 return 语句中,所有这些包含配对的数组被连接在一起并作为最终输出呈现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 2011-10-02
    相关资源
    最近更新 更多