Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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_Algorithm_Recursion - Fatal编程技术网

查找数组中的所有子集,递归不起作用,JavaScript

查找数组中的所有子集,递归不起作用,JavaScript,javascript,algorithm,recursion,Javascript,Algorithm,Recursion,我试图实现给定一组不同的整数S,返回所有可能的子集的问题 [A,B,C]应该给出[[],[A],[A,B],[A,B,C],[A,C],[B],[B,C]] 无法找出函数不回溯的原因 对于输入[A、A、B、C],我的实现输出[[]、[“A”]、[“A”、“A”]、[“A”、“A”、“B”]、[“A”、“A”、“B”、“C”]] 这是我的密码 var subsets = function(A){ /*for input [ A, A, B, C ], appendCount returns [

我试图实现给定一组不同的整数S,返回所有可能的子集的问题

[A,B,C]应该给出[[],[A],[A,B],[A,B,C],[A,C],[B],[B,C]]

无法找出函数不回溯的原因

对于输入[A、A、B、C],我的实现输出[[]、[“A”]、[“A”、“A”]、[“A”、“A”、“B”]、[“A”、“A”、“B”、“C”]]

这是我的密码

var subsets = function(A){
  /*for input [ A, A, B, C ], appendCount returns [ [A, 2], [B, 1], [C,1] ]*/
  var arr = appendCount(A);
  result =[[]];
  var tempArr = [];

  var findSubsets = function(index, tempArr, a) {
    var arrCopy = a.slice();
    while(index < arrCopy.length) {
      if(arrCopy[index][1] > 0) {
        tempArr.push(arrCopy[index][0]);
        result.push(tempArr.slice());
        var newArr = arrCopy.slice();
        newArr[index][1] -= 1;
        findSubsets(index, tempArr, newArr);
        tempArr.pop();
        index++;
   } else {
       index++;
   }
 } 
}
 findSubsets(0, tempArr, arr.slice());
 return result;
}
var子集=函数(A){
/*对于输入[A,A,B,C],appendCount返回[A,2],[B,1],[C,1]]*/
var arr=附加计数(A);
结果=[]];
var tempArr=[];
var findSubsets=函数(索引、tempArr、a){
var arrCopy=a.slice();
while(索引0){
tempArr.push(arrCopy[index][0]);
result.push(tempArr.slice());
var newArr=arrCopy.slice();
newArr[index][1]=1;
findSubsets(索引、tempArr、newArr);
tempArr.pop();
索引++;
}否则{
索引++;
}
} 
}
查找子集(0,tempArr,arr.slice());
返回结果;
}
提前感谢

function findSubsets( array, position ){
    position = position || 0;

    if (position >= array.length) return [[]];

    var output = findSubsets( array, position + 1 );

    for (var i = 1, endI = output.length; i < endI ; i++){
        output.push( 
            output.slice(i, i+1).concat( array[position] )
        );
    };

    return output.concat( array[position] );
};
函数查找子集(数组、位置){
位置=位置| | 0;
if(position>=array.length)返回[];
var输出=findSubsets(数组,位置+1);
for(变量i=1,endI=output.length;i
迭代的

function findSubsetsIterative( array ){
    var output = [];

    for (var n = 0 , limit = 1 << array.length ; n < limit ; n++) {
        var subSet = [];
        for (var i = n, p = 0; i ; i >>= 1, p++){
            if (i & 1) subSet.push( array[p] );
        };
        output.push( subSet )
    };

    return output;
};
函数findSubsetsIterative(数组){
var输出=[];
对于(var n=0,limit=1>=1,p++){
if(i&1)子集push(数组[p]);
};
output.push(子集)
};
返回输出;
};
递归

function findSubsets( array, position ){
    position = position || 0;

    if (position >= array.length) return [[]];

    var output = findSubsets( array, position + 1 );

    for (var i = 1, endI = output.length; i < endI ; i++){
        output.push( 
            output.slice(i, i+1).concat( array[position] )
        );
    };

    return output.concat( array[position] );
};
函数查找子集(数组、位置){
位置=位置| | 0;
if(position>=array.length)返回[];
var输出=findSubsets(数组,位置+1);
for(变量i=1,endI=output.length;i
迭代的

function findSubsetsIterative( array ){
    var output = [];

    for (var n = 0 , limit = 1 << array.length ; n < limit ; n++) {
        var subSet = [];
        for (var i = n, p = 0; i ; i >>= 1, p++){
            if (i & 1) subSet.push( array[p] );
        };
        output.push( subSet )
    };

    return output;
};
函数findSubsetsIterative(数组){
var输出=[];
对于(var n=0,limit=1>=1,p++){
if(i&1)子集push(数组[p]);
};
output.push(子集)
};
返回输出;
};

不要为每个递归调用创建新数组,而是为字符及其计数使用公共数组,并在回溯时重置字符计数值

var subsets = function(array) {
var charCountArray = appendCount(array);
var result = [[]];
var findSubsets = function(tempArray, index) {
   if(index >= array.length) {
     return;
   }
   for(var i=index; i<charCountArray.length; i++) {
    if(charCountArray[i][1] <= 0) {
      continue;
    }
    tempArray.push(charCountArray[i][0]);
    result.push(tempArray.slice());
    charCountArray[i][1] -= 1;
    findSubsets(tempArray, i);
    charCountArray[i][1] += 1;
    tempArray.pop();
 }
}
findSubsets([],0);
return result;
}
var子集=函数(数组){
var charCountArray=appendCount(数组);
var结果=[[]];
var findSubsets=函数(临时数组,索引){
如果(索引>=array.length){
返回;
}

对于(var i=index;i而不是为每个递归调用创建一个新数组,使用一个用于字符及其计数的公共数组,并在回溯时重置字符计数值

var subsets = function(array) {
var charCountArray = appendCount(array);
var result = [[]];
var findSubsets = function(tempArray, index) {
   if(index >= array.length) {
     return;
   }
   for(var i=index; i<charCountArray.length; i++) {
    if(charCountArray[i][1] <= 0) {
      continue;
    }
    tempArray.push(charCountArray[i][0]);
    result.push(tempArray.slice());
    charCountArray[i][1] -= 1;
    findSubsets(tempArray, i);
    charCountArray[i][1] += 1;
    tempArray.pop();
 }
}
findSubsets([],0);
return result;
}
var子集=函数(数组){
var charCountArray=appendCount(数组);
var结果=[[]];
var findSubsets=函数(临时数组,索引){
如果(索引>=array.length){
返回;
}
有关(var i=指数;请参见