给定一个4位锁,其中每个数字可以是0、1、2、3或4,我如何计算所有加起来为4的组合

Given a 4 digit lock, where each digit can be 0, 1, 2, 3, or 4, how can I calculate all combinations that add up to a total of 4?

本文关键字:组合 起来 计算所 一个 4位锁 数字      更新时间:2024-01-07

给定一个4位数的锁,其中每个数字可以是0、1、2、3或4,我如何创建一个由所有组合组成的数组,总共4个?例如:

[1, 1, 1, 1] is good, 1 + 1 + 1 + 1 == 4
[4, 0, 0, 0] is good, 4 + 0 + 0 + 0 == 4
[0, 4, 0, 0] is good, 0 + 4 + 0 + 0 == 4
[0, 3, 1, 0] is good, 0 + 3 + 1 + 0 == 4
[0, 0, 2, 2] is good, 0 + 0 + 2 + 2 == 4
[1, 2, 3, 4] is not, because 1 + 2 + 3 + 4 != 4

一个想法是通过强力循环遍历所有4位数字(0000100001000010,…),将数字相加,看看它们是否==4,如果是,将其添加到我的列表中。这里的问题是会有很多浪费的迭代,因为我不在乎任何>=5的数字,因为这些数字永远不会==4。

我已经考虑了好几个小时了,可以用一个全新的视角,谢谢!

这是一个使用迭代递归样式来获得正确长度和所需总和的提案。

如果需要的话,它适用于任何长度,比如7,如果可以的话,适用于每一笔金额。

function combine(array, length, sum) {
    function add(a, b) { return a + b; }
    function iter(a) {
        var r = this.concat(a);
        if (r.length === length) {
            r.reduce(add) === sum && result.push(r);
            return;
        }
        array.forEach(iter, r);
    }
    var result = [];
    array.forEach(iter, []);
    return result;
}
document.write('<pre>' + JSON.stringify(combine([0, 1, 2, 3, 4], 4, 4), 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(combine([0, 1, 2, 3], 3, 5), 0, 4) + '</pre>');

我不应该为您做这项工作,但一个简单的优化是在组合>4时立即停止当前迭代。