Javascript 获取N个大小的数字,这些数字加起来就是X
我的问题可能看起来像是重复的,但我找不到如何在香草javascript中做到这一点。 (我在python中找到了答案。) 所以基本上我想得到一个列表,列出所有可能的数字组合,这些组合的总和就是一个期望的数字 例如:Javascript 获取N个大小的数字,这些数字加起来就是X,javascript,recursion,Javascript,Recursion,我的问题可能看起来像是重复的,但我找不到如何在香草javascript中做到这一点。 (我在python中找到了答案。) 所以基本上我想得到一个列表,列出所有可能的数字组合,这些组合的总和就是一个期望的数字 例如: 函数和到n(n,size){ x=和(6,3) // [6,0,0] [5,1,0] [4,2,0] [4,1,1] [3,3,0] [3,2,1] [2,2,2] 这就是我目前能做的: 函数和到(n,大小,和=[],限制){ 如果(大小==1){ 推送总和(n) 回报金额 } 如
函数和到n(n,size){
x=和(6,3)
// [6,0,0] [5,1,0] [4,2,0] [4,1,1] [3,3,0] [3,2,1] [2,2,2]
这就是我目前能做的:
函数和到(n,大小,和=[],限制){
如果(大小==1){
推送总和(n)
回报金额
}
如果(!限制){
极限=n
}
让开始=Math.min(n,极限)
停止=数学单元(n/尺寸)-1
for(让我=开始;我>停止;我--){
设tmp=[…和];
tmp.push(一)
让组合=和(n-i,大小-1,tmp,i)
if(组合){
console.log(组合)//这项工作
}
}
}
//我不知道该怎么做
设x=sum_to_n(6,3)
//或者这个
for(让y和n(6,3)){
控制台日志(y)
}
让求和到n=(n,迭代限制)=>{
设res=[];
for(设i=0;i
这对我来说很有效,但是它没有大小参数。让getOperator=(大小、arr、expect)=>{
let getOperator = (size, arr, expect) => {
let ev = "";
for (let i = 0; i < size; i++) {
ev += `${arr[i]}+`;
}
return `${ev.slice(0, ev.length-1)} == ${expect}`;
}
let sum_to_n = (n, size, iteration_limit) => {
return new Promise(resolve => {
let identifiers = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split('');
let all_identifiers = [];
let res = [];
let ev = "";
for (let i = 0; i < size; i++) {
let r = identifiers[i];
all_identifiers.push(r);
ev += `for (let ${r} = 0; ${r} < iteration_limit; ${r}++){\n`;
}
let push_value_string = "";
for (let i = 0; i < all_identifiers.length; i++) {
push_value_string += `${all_identifiers[i]}, `;
}
ev += `\nif(${getOperator(size, all_identifiers, n)}){\nres.push([${push_value_string.slice(0, push_value_string.length-1)}]);\n}`;
for (let i = 0; i < size; i++) {
ev += "}";
}
console.log(ev);
eval(ev);
resolve(res);
});
};
sum_to_n(15, 3, 100).then(console.log);
让ev=“”;
for(设i=0;i{
返回新承诺(解决=>{
let identifiers=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz”。拆分(“”);
让所有_标识符=[];
设res=[];
让ev=“”;
for(设i=0;i
基本上取决于它在文本中生成JavaScript代码的大小,保存它在for循环中使用的单词,并检查相加是否等于n
。然后评估并解决它。
“严格使用”;
函数_sumToN(n,大小,acc=[],解决方案=[]){
如果(大小==0){
const sum=acc.reduce((sum,num)=>sum+num);
返回和===n个解。concat([acc]):解;
}
对于(设i=0;i这与之密切相关,2+2
,2+1
,和1+1
,虽然可能有一种更直接的方法L计算总和时,在分区
函数上很容易做到:
const分区=(n,max=n)=>
n==0
? [[]]
:n<0
? []
:Array.from({length:Math.min(n,max)},({,i)=>i+1)//或使用'ramge'函数
.reverse()
.flatMap(x=>partitions(n-x,x).map(p=>[x,…p]))
const sumToN=(n,c)=>
分区(n+c)
.filter(p=>p.length==c)
.map(p=>p.map(x=>x-1))
console.log(萨姆顿(6,3))
。作为控制台包装{最大高度:100%!重要;顶部:0}
OP正在寻找一个具有动态大小的递归解决方案。这不是递归的,大小是固定的。这似乎是一个很长的错误。标识符
…承诺可以明显同步的东西…它不是递归的,这是OP想要的…谢谢。它确实给了我一个想法。这解决方案将给出具有不同索引的重复数字,例如[1,2,3][3,2,1]。但我想只需添加一些集合检查器就可以了。