定义数组的所有和的组合

时间:2017-08-10 08:25:58

标签: javascript

所以我扫描了一下网站,除了排列外没有发现任何内容,但事实并非如此。我正在寻找的是输入一个元素数组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++;
}

1 个答案:

答案 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));