在数学中有排列组合,用来计算概率。
比如:从n个数字中,任意选择m个的情况。从5个数字中任意选择3个数字的情况。(这里我们只考虑没有顺序的情况)。
公式:C(n,m)=n!/[m!(n-m)!]=n*(n-1)*...*(n-m+1)/[1*2*...*m],如C(5,2)=[5*4]/[1*2]=10.
举例说明:有 1,2,3,4 四个数字,从这四个数字中,任意选择两个数字一共有多少种情况:[1,2], [1,3], [1,4], [2,3], [2,4], [3,4]一共有这六种情况。
下面用代码实现从n个数字中任意选择m个的情况(不考虑顺序)。
/* arr 第一个参数 需要排列组合的数组,len 第二个参数为需要组合的个数 */
/* 返回参数为多为数组[[],[]] */
function rankFun(arr, len = 3) {
var returnArr = [];
var calculationFun = function(calcuArr, cArr = null) {
var copyArr = [].concat(calcuArr);
!cArr && copyArr.splice(0, 1);
for(var i = 0, l = copyArr.length; i < l; i++) {
var strArr1 = cArr? [].concat(cArr): [calcuArr[0]];
strArr1.push(copyArr[i]);
if(strArr1.length >= len) {
returnArr.push(strArr1);
} else {
var newCopy = [].concat(copyArr);
newCopy.splice(0, i+1);
calculationFun(newCopy, strArr1);
}
}
if(!cArr) {
if(copyArr.length > len) {
calculationFun(copyArr);
} else {
returnArr.push(copyArr);
}
}
}
len <= 1 ?(returnArr = arr) :calculationFun(arr);
return returnArr;
}
var arr = [0,2,3,-1,8];
console.log(rankFun(arr, 4));
代码输出结果如下: