生成所有可能的配对

时间:2014-10-27 01:27:14

标签: recursion pseudocode

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

我想为一系列数字生成所有配对。它们不必全部存储,只需至少生成一次。例如,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重复这个过程。

我的问题是我无法弄清楚如何将其实现为递归函数。我发现它必须保留所有解决方案的运行列表(因此可以找到一些东西),同时还必须添加更小的解决方案并将它们组合起来。这对我来说太难以想象,所以对方法或伪代码的任何帮助(尽可能简单)都将非常感激。

1 个答案:

答案 0 :(得分:0)

这是一些伪代码:

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语句中,包含配对的所有这些数组都连接在一起并显示为最终输出。