2017-03-06 1 views
1

実装しようとしています。異なる整数の集合Sが与えられた場合、可能なすべてのサブセット問題を返します。 [A、B、C]、[A、C]、[B]、[B、C]は、[A、B、C] 、[C]]。配列内のすべてのサブセットを検索し、再帰が機能していない、JavaScript

なぜ機能がバックトラックしないのかわかりません。入力[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; 
} 

事前に感謝

+4

[再帰的関数呼び出しを伴わない順列](http://stackoverflow.com/questions/34013675/permutations-without-recursive-function-call)を参照してください。 – guest271314

答えて

0

再帰

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

反復

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; 
}; 
0

、文字とその回数に共通の配列を使用バックトラック中に文字カウント値をリセットします。

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; 
} 
関連する問題