JSは並べ替え結果の個数を計算します.


計算結果を用いて結果セットlengthを取得すると、結果集合が大きすぎると、カートン現象があります.
Array.prototype.combinate = function(iItems, aIn) {
       if (!aIn) {
              var aIn = new Array();
              this.combinate.aResult = new Array();
       }
       for (var i = 0; i < this.length; i++) {
              var a = aIn.concat(this[i]);
              var aRest = this.concat(); // Concat with nothing to create copy
              aRest.splice(0, i + 1);
              if (iItems && iItems - 1 <= aRest.length) {
                     aRest.combinate(iItems - 1, a);
                     if (iItems == 1) this.combinate.aResult.push(a);
              }
       }
       return this.combinate.aResult;
};
そして、公式に従って直接計算した結果を思い出しました.問題のように、公式m!/n!(m-n)ダブルカラーボール33選5 33!/5です(33-5)計算してみます8.683317188119*10の36乗
The JavaScript number format allows you to exactly represent all integers between
−9007199254740992  and 90071992547409922 53
明らかに超えました.正確ではありません.そして自分で組み合わせを計算する方法を考えました.8選3組の数は8*7*6/3*2*1で間違いなく彼を使って解決します.
Array.prototype.combine = function (iItems) {
    function func(n,m){
        if(m==0)
            return 1;
        else
            return n*func(n-1,m-1);
    }
    // c 83 = 8*7*6/ 3*2*1
    var bottomNumber = this.length;
    var topNumber = iItems;
    return func(bottomNumber,topNumber)/func(topNumber,topNumber);
};
問題を完璧に解決しました.