function func(arr) {
arr = Array.prototype.sort.call(arr);
const len = arr.length;
const res = [];
// 回溯
const _backtracking = (count, start, nums) => {
// count < 0,说明已经到了边界值
if (count < 0) {
return;
}
// count == 0,说明正好是一个子集,深拷贝
if (count == 0) {
res.push(JSON.parse(JSON.stringify(nums)));
} else {
// 从当前的起始位依次填充数字,注意当前数值后续仍可复用,所以需要弹出
for (let i = start; i < len; ++i) {
nums.push(arr[i]);
_backtracking(count - 1, i + 1, nums);
nums.pop();
}
}
};
// 子集长度 [0, len]
for (let i = 0; i <= len; ++i) {
_backtracking(i, 0, []);
};
return res;
}
const result = func([ 1, 4, 3, 2 ]);
console.log(result);
07-24
859
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)