这是递归的一个问题,这让我很困惑。
我想为一系列数字生成所有配对。它们不必全部存储,只需至少生成一次。例如,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 :(得分: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语句中,包含配对的所有这些数组都连接在一起并显示为最终输出。