Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于纸牌游戏的javascript中的数组子集组合_Javascript_Math_Permutation_Partition - Fatal编程技术网

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

用于纸牌游戏的javascript中的数组子集组合,javascript,math,permutation,partition,Javascript,Math,Permutation,Partition,在用javascript制作纸牌游戏时,我很难找到一个组合电子问题的解决方案。我想得到一个集合的所有组合,以便使用所有元素 given: [1, 2, 3] returns: [ [[1], [2], [3]], [[1, 2], 3], [[1, 3], 2], [[2, 3], 1], [[1, 2, 3]] ] 游戏是。这个问题可以用递归的方式解决 首先我们需要声明两个数组,一个包含输入(给定数组),另一个包含结果(最初为空) 现在,让我们创建递归

在用javascript制作纸牌游戏时,我很难找到一个组合电子问题的解决方案。我想得到一个集合的所有组合,以便使用所有元素

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

游戏是。

这个问题可以用递归的方式解决

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

现在,让我们创建递归函数,将子集数组推送到结果数组:

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)

您可以通过以下链接在线测试算法:

函数置换(arr){
常数res=[];
对于(var map=1;map<2**arr.length;map++){
常数rest=[],
subset=arr.filter((el,i)=>(map&(1[subset,…arr]):[[subset]]);
}
//控制台日志(res);
返回res;
}
console.log(permute([1,2,3]))

这是无序排列的一个很好的实现,但它不是我想要的。在我的场景中,我需要枚举这些排列,并找到它们的所有可能组合,它们使用原始数组中的所有元素。您给定的数组
var givenArray=[1,2,3]返回
[[1,2,3],[1,2],[1,3],[1],[2,3],[2],[3]
。我正在寻找一个类似于
[[1],[2],[3],[1,2],3],[1,3],2],[2,3],1],[1,2,3]].
这实际上更接近解决方案。它有多余的结果,因为对我来说顺序无关紧要,但它包含所有正确的子集组合。也许对我来说,过滤掉重复会更容易,谢谢!
function getSubArray(array, position) {
    if(position === givenArray.length) {
        resultArray.push(array);
        return;
    }
    getSubArray(array.concat(givenArray[position]), position+1);
    getSubArray(array, position+1);
}
 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]))