/*
e:数组长度
t:组合数组的长度
*/
nCr(e, t) {
if (t > e) return 0;
var n = 1;
~~(e / 2) + 1 > t && (t = e - t);
for (var a = t + 1; a <= e; a++) n *= a;
for (var r = 1; r <= e - t; r++) n /= r;
return n;
}
数组的重新组合
/**
@param {} source 源数组
@param {} count 要取出多少项
* @return {any[]} 所有排列组合
*/
getNumbers(source, count) {
//如果只取一位,返回数组中的所有项,例如 [ [1], [2], [3] ]
let currentList = source.map((item) => [item]);
if (count === 1) {
return currentList;
}
let result = [];
//取出第一项后,再取出后面count - 1 项的排列组合,并把第一项的所有可能(currentList)和 后面count-1项所有可能交叉组合
for (let i = 0; i < currentList.length; i++) {
let current = currentList[i];
//如果是排列的方式,在取count-1时,源数组中排除当前项
let children = this.getNumbers(source.slice(i + 1), count - 1);
for (let child of children) {
result.push([...current, ...child]);
}
}
return result;
}
计算组合数/*e:数组长度t:组合数组的长度*/nCr(e, t) { if (t > e) return 0; var n = 1; ~~(e / 2) + 1 > t && (t = e - t); for (var a = t + 1; a <= e; a++) n *= a; for (var r = 1; r <= e - t; r++) n /= r; return n