Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取N个大小的数字,这些数字加起来就是X_Javascript_Recursion - Fatal编程技术网

Javascript 获取N个大小的数字,这些数字加起来就是X

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) 回报金额 } 如

我的问题可能看起来像是重复的,但我找不到如何在香草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
}
让开始=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]。但我想只需添加一些集合检查器就可以了。