创建排列以达到目标数

时间:2017-04-06 12:07:13

标签: javascript math recursion permutation

我有阵列[1,2,4],我想制作4;我希望它返回[4],而不是[[1,1,1,1],[1,1,2],[2,2],[4]],我以前这样做但我开始跑在小型服务器上运行时内存不足。我不得不让整个函数运行,所以我可以.reverse(),因为数组中的最后一次只对我有用。

如果我们从货币的角度考虑这个问题,那么我们采取[0.5,0.5,1,0.2];如果我想要1美元,我想要[1]而不是[0.5,0.5],因为你总是想要每个项目的最大价值吗?

我目前正在使用这个:



function getCombinations(array, sum) {

    function fork(i, t) {
        var s = t.reduce(function (a, b) { return a + b; }, 0);
        if (sum === s) {
            result.push(t);
            return;
        }
        if (s > sum || i === array.length) {
            return;
        }
        fork(i + 1, t.concat([array[i]]));
        fork(i + 1, t);
    }

    var result = [];
    fork(0, []);
    return result;
}

console.log(getCombinations([1, 2, 4], 4));

.as-console-wrapper { max-height: 100% !important; top: 0; }




但是这并没有倒退,所以我让它向后迭代:



function getCombinations(array, sum) {

    function fork(i, t) {
        var s = t.reduce(function (a, b) { return a + b; }, 0);
        if (sum === s) {
            result.push(t);
            return;
        }
        if (s > sum || i === 0) {
            return;
        }
        fork(i - 1, t.concat([array[i]]));
        fork(i - 1, t);
    }

    var result = [];
    fork(array.length, []);
    return result;
}

console.log(getCombinations([1, 2, 4], 4));

.as-console-wrapper { max-height: 100% !important; top: 0; }




但这并不适用于我使用的大型操作,例如我试图这样做:

警告:这可能会破坏您的浏览器



function getCombinations(array, sum) {

    function fork(i, t) {
        var s = t.reduce(function (a, b) { return a + b; }, 0);
        if (sum === s) {
            result.push(t);
            return;
        }
        if (s > sum || i === 0) {
            return;
        }
        fork(i - 1, t.concat([array[i]]));
        fork(i - 1, t);
    }

    var result = [];
    fork(array.length, []);
    return result;
}

var Items = [];

for(var j = 0; j < 7; j++) Items.push(0.11);
for(var k = 0; k < 197; k++) Items.push(1);

console.log(getCombinations(Items, 26.77));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

0 个答案:

没有答案