如何实现动态循环以计算多维数组的所有元素组合和?
计算任意数量子数组的所有组合和
针对你提出的「当arrayGroup中子数组数量为N时,计算所有N元素组合的和」的需求,这里提供两种简洁可行的实现方案:
方案一:递归实现(逻辑直观)
递归的核心思路是将N个子数组的问题拆解为「第一个子数组」与「剩余N-1个子数组的所有组合和」的两两组合,逐层递归直到只剩单个子数组,再反向合并结果。
function getAllCombinationSums(arrayGroup) { // 终止条件:仅剩余一个子数组时,直接返回其所有元素(单个数组的组合和即自身元素) if (arrayGroup.length === 1) { return arrayGroup[0].map(num => num); } // 拆分出第一个子数组,递归处理剩余子数组 const firstArr = arrayGroup[0]; const restCombinationSums = getAllCombinationSums(arrayGroup.slice(1)); // 生成所有组合和 const result = []; for (const num of firstArr) { for (const sum of restCombinationSums) { result.push(num + sum); } } return result; } // 测试示例 const twoGroups = [[1,2,3],[1,2,3]]; console.log(getAllCombinationSums(twoGroups)); // 输出:[2,3,4,3,4,5,4,5,6] const threeGroups = [[1,2,3],[1,2,3],[1,2,3]]; console.log(getAllCombinationSums(threeGroups)); // 输出所有3个子数组元素组合的和
方案二:迭代实现(基于reduce,无栈溢出风险)
使用数组的reduce方法迭代处理每个子数组,逐步累积生成所有组合和,适合处理子数组数量较多的场景(避免递归栈溢出)。
function getAllCombinationSums(arrayGroup) { // 初始值设为[0],第一次迭代时与第一个数组元素相加得到自身元素 return arrayGroup.reduce((prevSums, currentArr) => { const newSums = []; for (const prevSum of prevSums) { for (const num of currentArr) { newSums.push(prevSum + num); } } return newSums; }, [0]); } // 测试示例 console.log(getAllCombinationSums([[1,2,3],[1,2,3]])); console.log(getAllCombinationSums([[1,2,3],[1,2,3],[1,2,3]]));
说明
- 两种方案均支持任意数量的子数组,且子数组长度无需固定(即使每个子数组长度不同也能正常计算)。
- 递归方案逻辑清晰易理解,但子数组数量过多时可能触发栈溢出;迭代方案更稳定,适合大规模数据场景。
内容的提问来源于stack exchange,提问作者LebTim
相关产品推荐
相关产品推荐

