在使用javascript制作纸牌游戏时,我无法找到解决组合问题的方案。我想获得一组的所有组合,以便使用所有元素。
given: [1, 2, 3]
returns: [
[[1], [2], [3]],
[[1, 2], 3],
[[1, 3], 2],
[[2, 3], 1],
[[1, 2, 3]]
]
游戏是Cassino。
答案 0 :(得分:0)
function permute(arr){
const res = [];
for(var map = 1; map < 2 ** arr.length; map++){
const rest = [],
subset = arr.filter((el, i) => (map & (1 << i)) || (rest.push(el), false));
//console.log(subset, rest);
res.push(...(rest.length ? permute(rest).map(arr => [subset,...arr]) : [[subset]]));
}
//console.log(res);
return res;
}
console.log(permute([1,2,3]))
答案 1 :(得分:-1)
这个问题可以通过递归的方式解决。
首先我们需要声明两个数组,一个包含输入(给定数组),另一个包含结果(最初为空)
var givenArray = [1, 2, 3];
var resultArray = [];
现在让我们创建递归函数,将子集数组推送到结果数组:
function getSubArray(array, position) {
if(position === givenArray.length) {
resultArray.push(array);
return;
}
getSubArray(array.concat(givenArray[position]), position+1);
getSubArray(array, position+1);
}
现在开始将所有子集设置为resultArray
我们只需要调用我们的getSubArray
函数,其中一个空数组和一个起始位置为0作为参数
getSubArray([], 0);
之后,如果要从结果中删除空集([]),只需删除resultArray
的最后一个元素
resultArray.splice(-1,1);
您可以通过以下链接在线测试算法:https://jsbin.com/xigipihebe/edit?js,console