给定一个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位数的锁,其中每个数字可以是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时立即停止当前迭代。
相关文章:
- 根据id将json数组组合为一个json数组
- 接受不在列表中的值-引导组合框
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 组合两个javascript函数
- Telerik rad组合框多列数据绑定
- Steam Web API:I'我不知道该如何处理这个看起来像哈希的url来生成图像
- 组合 2 个 JavaScript .scroll 函数
- 如何使用jquery组合两个数组
- onChange不足以从Dojo组合框触发查询
- 如何使删除线看起来像x
- 组合承诺和非承诺值
- 所有控件的组合框
- 在D3中组合多个事件
- 给定一个4位锁,其中每个数字可以是0、1、2、3或4,我如何计算所有加起来为4的组合
- 可以't不能把两根绳子正确地组合起来
- 将 2 个数字组合起来用作对象键的有效方法是什么
- 如何将javascript和jQuery函数组合起来隐藏按钮
- 如何将输入的单词组合起来?
- 有没有一种方法可以将两个或多个执行类似操作的事件组合起来使用DRY原理
- 试图将随机化的数字组合起来