2 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
您可以在末尾修改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貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是遞歸函數(shù)的非生成版本,它將給出您想要的結(jié)果。它計(jì)算出當(dāng)前級(jí)別 ( 0..maxSum) 的所有可能值,然后將它們附加到數(shù)組的所有可能結(jié)果中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));
添加回答
舉報(bào)