javascript 中的递归 forEach()
Recursive forEach() in javascript
我有一堆数字数组,例如:
let a = [1,2,3];
let b = [4,5,7];
let c = [11,13,17]
我想创建一个函数,告诉我数组中的数字组合乘以不同数组中的数字得到某个数字。以下是我目前的代码:
// to get which combination of numbers result to 165
a.forEach(x=>{
b.forEach(y=>{
c.forEach(z=>{
if(x*y*z==165){
console.log(x,y,z)
}
})
})
})
我想创建一个函数,可以将数字数组输入数组,例如:[[1,2],[2,5,],[7,11],[13,17]]
并返回数字组合,当相乘时,可以得到某个数字.
这是一个递归函数,它接受一个输入数字和数字数组的数组。它处理第一个数字数组,找到任何可能的除数,如果是,则使用除法输入和数组的余额递归调用自身,以查看该对值是否有任何除数。如果是这样,它们将附加到当前除数以产生结果:
const findDivisors = (num, arrs) => {
let result = [];
if (arrs.length == 1) {
return arrs[0].filter(n => n == num);
}
arrs[0].forEach(n => {
if (num % n === 0) {
findDivisors(num / n, arrs.slice(1)).forEach(r => result.push([n].concat(r)));
}
});
return result;
}
let a = [1, 2, 3];
let b = [4, 5, 7];
let c = [11, 13, 17];
console.log(findDivisors(165, [a, b, c]));
console.log(findDivisors(136, [a, b, c]));
这表达了与 Nick 的回答相同的算法,但写法非常不同:
const findDivisors = (t, [ns, ...nss]) =>
nss .length == 0
? ns .filter (n => n == t) .map (n => [n])
: ns .flatMap (n => t % n == 0 ? findDivisors (t / n, nss) .map (ns => [n, ...ns]) : [])
const ns = [
[1, 2, 3, 5, 6, 9],
[2, 3, 4, 8, 12],
[3, 5, 9, 12, 16, 18]
]
console .log (findDivisors (100, ns))
console .log (findDivisors (144, ns))
console .log (findDivisors (240, ns))
.as-console-wrapper {max-height: 100% !important; top: 0}
我更喜欢使用表达式而不是语句。但据我所知,除了风格问题外,它与尼克的回答没有任何优势或劣势。
最好也处理空数组的可能性,它可能看起来像:
const findDivisors = (t, [ns, ...nss]) =>
ns == undefined
? []
: nss .length == 0
? ns .filter (n => n == t) .map (n => [n])
: ns .flatMap (n => t % n == 0 ? findDivisors (t / n, nss) .map (ns => [n, ...ns]) : [])
我有一堆数字数组,例如:
let a = [1,2,3];
let b = [4,5,7];
let c = [11,13,17]
我想创建一个函数,告诉我数组中的数字组合乘以不同数组中的数字得到某个数字。以下是我目前的代码:
// to get which combination of numbers result to 165
a.forEach(x=>{
b.forEach(y=>{
c.forEach(z=>{
if(x*y*z==165){
console.log(x,y,z)
}
})
})
})
我想创建一个函数,可以将数字数组输入数组,例如:[[1,2],[2,5,],[7,11],[13,17]]
并返回数字组合,当相乘时,可以得到某个数字.
这是一个递归函数,它接受一个输入数字和数字数组的数组。它处理第一个数字数组,找到任何可能的除数,如果是,则使用除法输入和数组的余额递归调用自身,以查看该对值是否有任何除数。如果是这样,它们将附加到当前除数以产生结果:
const findDivisors = (num, arrs) => {
let result = [];
if (arrs.length == 1) {
return arrs[0].filter(n => n == num);
}
arrs[0].forEach(n => {
if (num % n === 0) {
findDivisors(num / n, arrs.slice(1)).forEach(r => result.push([n].concat(r)));
}
});
return result;
}
let a = [1, 2, 3];
let b = [4, 5, 7];
let c = [11, 13, 17];
console.log(findDivisors(165, [a, b, c]));
console.log(findDivisors(136, [a, b, c]));
这表达了与 Nick 的回答相同的算法,但写法非常不同:
const findDivisors = (t, [ns, ...nss]) =>
nss .length == 0
? ns .filter (n => n == t) .map (n => [n])
: ns .flatMap (n => t % n == 0 ? findDivisors (t / n, nss) .map (ns => [n, ...ns]) : [])
const ns = [
[1, 2, 3, 5, 6, 9],
[2, 3, 4, 8, 12],
[3, 5, 9, 12, 16, 18]
]
console .log (findDivisors (100, ns))
console .log (findDivisors (144, ns))
console .log (findDivisors (240, ns))
.as-console-wrapper {max-height: 100% !important; top: 0}
我更喜欢使用表达式而不是语句。但据我所知,除了风格问题外,它与尼克的回答没有任何优势或劣势。
最好也处理空数组的可能性,它可能看起来像:
const findDivisors = (t, [ns, ...nss]) =>
ns == undefined
? []
: nss .length == 0
? ns .filter (n => n == t) .map (n => [n])
: ns .flatMap (n => t % n == 0 ? findDivisors (t / n, nss) .map (ns => [n, ...ns]) : [])