配列から任意の数の組み合わせをすべて求める

配列 [1,2,3,4,5][1,2,3,4,5] からいずれか 2 つ(重複なし)を取得する時の例。

(function() {
  var base = [1,2,3,4,5];
  var num = 2;

  var combi = get_combi(base, num);
  console.log(combi);
})();

function get_combi(base, num, ary = [], idx = 0) {
  var result = [];
  for (var i = idx; i <= base.length - num; i++) {
    var newary = ary.concat(base[i]);
    if (num > 1) {
      var r = get_combi(base, num-1, newary, i+1);
      Array.prototype.push.apply(result, r);
    } else {
      result.push(newary);
    }
  }
  return result;
}
  1. (function() {
  2. var base = [1,2,3,4,5];
  3. var num = 2;
  4. var combi = get_combi(base, num);
  5. console.log(combi);
  6. })();
  7. function get_combi(base, num, ary = [], idx = 0) {
  8. var result = [];
  9. for (var i = idx; i <= base.length - num; i++) {
  10. var newary = ary.concat(base[i]);
  11. if (num > 1) {
  12. var r = get_combi(base, num-1, newary, i+1);
  13. Array.prototype.push.apply(result, r);
  14. } else {
  15. result.push(newary);
  16. }
  17. }
  18. return result;
  19. }
(function() {
  var base = [1,2,3,4,5];
  var num = 2;

  var combi = get_combi(base, num);
  console.log(combi);
})();

function get_combi(base, num, ary = [], idx = 0) {
  var result = [];
  for (var i = idx; i <= base.length - num; i++) {
    var newary = ary.concat(base[i]);
    if (num > 1) {
      var r = get_combi(base, num-1, newary, i+1);
      Array.prototype.push.apply(result, r);
    } else {
      result.push(newary);
    }
  }
  return result;
}

簡単にできるかと思ったら意外と難しくて2日間頭を悩ませました。
組み合わせの数が膨大になるとメモリがクラッシュするっぽいので改善の余地ありです。
いやー、再帰は頭が死ぬのであまり使いたくないですね。