/**
* 组合的实现
* 组合是集合的唯一子集 - 在本例中,每次从集合中取出 k 个元素。
* https://en.wikipedia.org/wiki/Combination
* @param {Array} x 任何类型的数据
* @param {int} k 每组对象的数量(无放回)
* @returns {Array<Array>} 组合的数组
* @example
* combinations([1, 2, 3], 2); // => [[1,2], [1,3], [2,3]]
*/
function combinations(x, k) {
let i;
let subI;
const combinationList = []; // 组合列表
let subsetCombinations; // 子集组合
let next; // 下一个组合
for (i = 0; i < x.length; i++) {
if (k === 1) {
combinationList.push([x[i]]);
} else {
subsetCombinations = combinations(x.slice(i + 1, x.length), k - 1);
for (subI = 0; subI < subsetCombinations.length; subI++) {
next = subsetCombinations[subI];
next.unshift(x[i]);
combinationList.push(next);
}
}
}
return combinationList;
}
export default combinations;