JSは並べ替え結果の個数を計算します.
3407 ワード
計算結果を用いて結果セット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 9007199254740992 ( 2 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);
};
問題を完璧に解決しました.