我正在尝试编写执行以下操作的函数:
> partitions([a,b,c,d])
< [
[[a,b],[c,d]],
[[a,c],[b,d]],
[[a,d],[b,c]]
]
即。它找到大小为2的所有分区。
目前我尝试递归地执行此操作:在每次调用时生成一对对列表,对于生成的每对,请在列表中再次调用该方法并删除该对。这有效,但它会产生重复。删除重复项需要比较生成的分区中的每个元素,这非常慢。
我想知道是否有更聪明的方法来做到这一点。
答案 0 :(得分:2)
只需获取所有项目的组合并过滤掉所有不需要的项目,例如
function getTwoCombinations(array) {
var i, j, result = [];
for (i = 0; i < array.length; i += 1) {
for (j = i + 1; j < array.length; j += 1) {
result.push([array[i], array[j]]);
}
}
return result;
}
var result = getTwoCombinations(getTwoCombinations(["a", "b", "c", "d"])).
filter(function(items) {
return items[0].every(function(item) {
return !(items[1].indexOf(item) + 1);
});
});
console.log(result);
<强>输出强>
[ [ [ 'a', 'b' ], [ 'c', 'd' ] ],
[ [ 'a', 'c' ], [ 'b', 'd' ] ],
[ [ 'a', 'd' ], [ 'b', 'c' ] ] ]
答案 1 :(得分:0)
一个好的策略是:
从头到尾
锁定一个元素(第一个元素)
1.1迭代下一个元素(第二个到结尾)并创建对
锁定下一个元素(第二个元素)
2.1迭代下一个元素(第三个到结尾)并创建对
3 ...重复直到最后一个元素
视觉帮助:
[a, ]
[a, b]
[a, c]
[a, d]
[b, ]
[b, c]
[b, d]
[c, ]
[c, d]