我无法弄清楚如何编写一个函数来计算数组元素的所有可能的和,每个加法最多4个元素。
给定
x = [1, 32, 921, 9213, 97, 23, 97, 81, 965, 82, 965, 823]
我需要从(1+32) ~ (965+823)转到(1+32+921+9213) ~ (965+82+965+823),计算所有可能的和。
(1+32) ~ (965+823)
(1+32+921+9213) ~ (965+82+965+823)
输出应该是这样的数组:
{33:[1,32],922:[1,921],.... 2835:[965,82,965,823]}
由所有可能的总和填充。
这不是为了做作业,Travis J在下面解释了我要寻找的东西:这是关于排列的。谢谢大家,我希望这对其他人也有用。
jsFiddle Demo
您可以使用置换子集递归算法来查找所有总和及其组合的集合。
var x = [1, 32, 921, 9213, 97, 23, 97, 81, 965, 82, 965, 823]; var sums = []; var sets = []; function SubSets(read, queued){ if( read.length == 4 || (read.length <= 4 && queued.length == 0) ){ if( read.length > 0 ){ var total = read.reduce(function(a,b){return a+b;},0); if(sums.indexOf(total)==-1){ sums.push(total); sets.push(read.slice().sort()); } } }else{ SubSets(read.concat(queued[0]),queued.slice(1)); SubSets(read,queued.slice(1)); } } SubSets([],x); console.log(sums.sort(function(a,b){return a-b;})); //log sums without sort to have them line up to sets or modify previous structure console.log(sets);