javascript - 获取 N 大小的数字,加起来等于数字 X
问题描述
我的问题可能看起来像是重复的,但我找不到如何在 vanilla javascript 中执行此操作。(我在这里在 python 中找到了答案。)
所以基本上我想得到一个所有可能的数字组合的列表,这些组合总和为所需的数字。
例如:
function sum_to_n(n,size){}
x = sum_to_n(6,3)
// [6,0,0] [5,1,0] [4,2,0] [4,1,1] [3,3,0] [3,2,1] [2,2,2]
到目前为止,这是我能做的:
function sum_to_n(n, size, sum=[], limit) {
if (size === 1) {
sum.push(n)
return sum
}
if (!limit) {
limit = n
}
let start = Math.min(n, limit)
let stop = Math.ceil(n/size) - 1
for (let i = start; i > stop; i--) {
let tmp = [...sum];
tmp.push(i)
let combination = sum_to_n(n-i, size - 1, tmp, i)
if (combination) {
console.log(combination) // this work
}
}
}
// I don't know how to make this work
let x = sum_to_n(6, 3)
// or maybe this
for (let y in sum_to_n(6,3)) {
console.log(y)
}
解决方案
'use strict';
function _sumToN(n, size, acc = [], solutions = []) {
if (size === 0) {
const sum = acc.reduce((sum, num) => sum + num);
return sum === n ? solutions.concat([acc]) : solutions;
}
for (let i = 0; i <= n; ++i)
solutions = _sumToN(n, size - 1, acc.concat(i), solutions);
return solutions;
}
function sumToN(n, size) {
return _sumToN(n, size);
}
console.log(sumToN(6, 3));
上面使用了一个驱动程序,_sumToN
它接受一个额外的acc
累加器数组,以及一个solutions
最终将保存所有解决方案的数组。它迭代如下:
0 0 0
0 0 1
0 0 2
...
0 0 6
...
6 6 6
并在它们总和为 时保存解决方案n
。当然可以进行优化,但希望这个微不足道的实现会有所帮助。
推荐阅读
- javascript - 大写块引用的第一个字母时遇到问题
- flutter - URI 的目标不存在:'package:flutter_gen/gen_l10n/gallery_localizations.dart'
- sql - Azure Synapse SQL 按需分页 (OFFSET/FETCH)
- flutter - Flutter如何在列表中显示列表的值
- python - 使用 Python 将 Kafka 数据写入 SQL Server 的最佳方法是什么?
- java - 如何将 jsonObject 设置为 java pojo
- rspec - Rspec swagger(openapi 3) 错误:“/components/responses”在架构上不存在
- python-3.x - pymqi.connect 在 Linux 上因错误 2059 MQRC_Q_MGR_NOT_AVAILABLE 而失败
- android - 使用 Glide 时如何修复崩溃的应用程序
- asp.net-mvc - 在发布时将 MVC 本地数据库更改为 SQL 数据库