2014-10-06 41 views
1
var combinations = function(numArr, choose, callback) { 
    var n = numArr.length; 
    var c = []; 
    var inner = function(start, choose_) { 
     if (choose_ == 0) { 
      callback(c); 
     } else { 
      for (var i = start; i <= n - choose_; ++i) { 
       c.push(numArr[i]); 
       inner(i + 1, choose_ - 1); 
       c.pop(); 
      } 
     } 
    } 
    inner(0, choose); 
} 

我不完全確定如何在完成創建所有組合後追加數組中的所有項目。我將如何追加列表中的所有組合?

我試圖對代碼進行一些修改,儘管我最終結果搞砸了。

例子:

+1

你想返回列表的列表是否正確? – cdosborn 2014-10-06 02:33:09

+0

是的,我有,所有的組合......不完全確定我會怎麼做。 – wateraura 2014-10-06 02:35:47

+0

你可以包含一些示例輸出。選擇確定組合應該有多長時間? – cdosborn 2014-10-06 03:02:18

回答

1

如果這是正確的輸出結果,我將它用於解決方案的一個小修復。 你的方法是完全正確的。你只需要考慮當你開始/結束 的組合。當組合結束時,您需要將當前組合推送到外部數組。 您的基本案例表明組合何時完成,此時您需要推送當前組合的COPY。

> combinations([0,1,2,3],2) 
[ [ 0, 1 ], 
    [ 0, 2 ], 
    [ 0, 3 ], 
    [ 1, 2 ], 
    [ 1, 3 ], 
    [ 2, 3 ] ] 
> combinations([0,1,2,3],3) 
[ [ 0, 1, 2 ], 
    [ 0, 1, 3 ], 
    [ 0, 2, 3 ], 
    [ 1, 2, 3 ] ] 

這是調整後的解決方案。如果您願意,可以使用c上的回調。

function combinations(numArr, choose, callback) { 
    var n = numArr.length; 
    var c = []; 
    var temp = []; 
    var inner = function(start, choose_) { 
     if (choose_ === 0) { 
      c.push(temp.slice()); 
     } else { 
      for (var i = start; i <= n - choose_; i++) { 
       temp.push(numArr[i]); 
       inner(i + 1, choose_ - 1); 
       temp.pop(); 
      } 
     } 
    } 
    inner(0, choose); 
    return c; 
} 
+0

這是正確的輸出,儘管我遵循一種我在網上看到的算法,雖然我並不完全知道如何在結束時輸出所有這些算法... – wateraura 2014-10-06 03:24:07

2

那麼,你試圖做這樣的事情:http://www.geeksforgeeks.org/print-all-possible-combinations-of-r-elements-in-a-given-array-of-size-n/

我發現了一個雙循環執行完成的任務相當不錯:

function findCombinations(nums, cb) { 
    var allCombinations = []; 
    var maxIndex = nums.length - 1; 
    var i = 0, j = 0; 
    for (i; i <= maxIndex; i += 1) { 
     for (j = i; j <= maxIndex; j += 1) { 
      if (i !== j) { 
       allCombinations.push([ nums[i], nums[j] ]); 
      } 
     } 
    } 
    cb(allCombinations); 
} 

findCombinations([1, 2, 3, 4], function (combinations) { 
    console.log(combinations); 
}); 

打印輸出:

[ [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 2, 3 ], [ 2, 4 ], [ 3, 4 ] ]

你是否專門試圖實現一個遞歸樹?

+0

不完全是,我需要它能夠改變組合的數量,而不是2我需要它從3種組合中取出。我想我可以按照你的例子,並添加遞歸我想。 我希望能夠修改每個組合內的元素數量* – wateraura 2014-10-06 03:12:26