答案是这样的,最开始参考了0-1背包的问题,都忘光光了
function printNum(n ,m ,num) { if(n === 0){ return; } if(m === 0 ){ console.log(num) } num.push(n); printNum(n-1,(m-n),num); num.pop(); printNum(n-1,m,num); } printNum(14, 15, []);
n就是从0-14 中选取多个,结果是15
当选取了当前数字后,那么剩下的就是在n-1个数字中选择总数减去当前值的递归
如果不选择当前数,那么就是在剩下n-1个数字中选择总数为m的递归 (m不变)
后面看了下解法,可以优化一部分,见下
function print(arr, n, m) {
if (n === 0) {
console.log(arr);
return;
}
if (n > (1 + m) * m * 0.5) --这一部分我再想想~
return;
if (n >= m) { ---这里规避了一些不必要的分支
arr.push(m);
print(arr, n - m, m - 1);
arr.pop();
}
print(arr, n, m - 1);
}