所以我扫描了一下网站,除了排列外没有发现任何内容,但事实并非如此。我正在寻找的是输入一个元素数组example: [2,5,10]
并获得所有可能的非重复总和的结果。有没有可以做到的?使用该示例,数组[7,10,15]
应该来自此类函数。
由于人们认为这是挑战或家庭作业,因此不是。 到目前为止我尝试过的是这样的事情,但我被困住了:
for(var i = 0; i < multipliers.length;){
var length = multipliers.length;
var counter = 0;
while(++counter <= length){
var x = 0;
var sum = multipliers[i] + multipliers[x];
x++;
console.log(sum)
}
i++;
}
答案 0 :(得分:1)
单循环唯一可行的解决方案是使用项目计数减去1来从零到2
进行计数。
基本上它呈现给了这个
indices comment
------- ---------
0 1 2
0 0 0
1 0 0
0 1 0
1 1 0 take this combination
0 0 1
1 0 1 take this combination
0 1 1 take this combination
1 1 1
function getCombination(array, size) {
var result = [],
temp,
i, j,
max = 1 << array.length;
for (i = 0; i < max; i++) {
temp = [];
for (j = 0; j < array.length; j++) {
if (i & 1 << j) {
temp.push(array[j]);
}
}
if (temp.length === size) {
result.push(temp.reduce(function (a, b) { return a + b; }));
}
}
return result;
}
console.log(getCombination([2, 5, 10], 2));
您可以在检查所需长度时使用递归方法,并且某些值仍然可用。
此解决方案适用于任何元素的嵌套方法,并在临时数组中收集它们。如果数组具有所需的长度,则添加元素并将结果推送到结果集。
重要的部分是使用实际元素的递归调用和没有实际元素的调用。
function getCombination(array, size) {
function getC(temp, i) {
if (temp.length === size) {
result.push(temp.reduce(function (a, b) { return a + b; }));
return;
}
if (i === array.length) {
return;
}
getC(temp.concat(array[i]), i + 1);
getC(temp, i + 1);
}
var result = [];
getC([], 0);
return result;
}
console.log(getCombination([2, 5, 10], 2));