2 回答

TA貢獻1865條經驗 獲得超7個贊
您可以在末尾修改trincot的解決方案filter
:
function findArrays(maxSize, maxSum) {
? let arr = [];
? let result = []; // <--- will collect all the subarrays
? function recur(maxSum) {
? ? let k = arr.length;
? ? result.push([...arr]);
? ? if (k === maxSize) return;
? ? for (let i = 0; i <= maxSum; i++) {
? ? ? arr[k] = i;
? ? ? recur(maxSum - i);
? ? }
? ? arr.length = k;
? }
? recur(maxSum);
? return result.filter(({ length }) => length == maxSize);
}
// demo
for (let arr of findArrays(3, 2))
? console.log(JSON.stringify(arr));

TA貢獻1824條經驗 獲得超6個贊
這是遞歸函數的非生成版本,它將給出您想要的結果。它計算出當前級別 ( 0..maxSum) 的所有可能值,然后將它們附加到數組的所有可能結果中size-1:
const findArrays = (size, maxSum) => {
let possibles = Array.from({
length: maxSum + 1
}, (_, i) => i);
if (size == 1) return possibles;
let result = [];
possibles.forEach(p => {
findArrays(size - 1, maxSum - p).forEach(a => {
result.push([p].concat(a));
});
});
return result;
}
console.log(findArrays(3, 2));
添加回答
舉報