javascript 中的纸牌游戏数组子集组合

array subset combinations in javascript for a card game

我在 javascript 中制作纸牌游戏时遇到组合电子学问题的解决方案。我想获得一组的所有组合,以便使用所有元素。

given: [1, 2, 3]
returns: [
    [[1], [2], [3]],
    [[1, 2], 3],
    [[1, 3], 2],
    [[2, 3], 1],
    [[1, 2, 3]]
]

游戏是Cassino

这道题可以用递归的方式求解。

首先我们需要声明两个数组,一个包含输入(给定数组),另一个包含结果(最初为空)

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 我们只需要使用一个空数组和一个起始位置 0 作为参数调用我们的 getSubArray 函数

getSubArray([], 0);

之后,如果要从结果中删除空集 ([]),只需删除 resultArray 的最后一个元素 resultArray.splice(-1,1);

你可以通过这个link在线测试算法:https://jsbin.com/xigipihebe/edit?js,console

 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]))

Try it!