我有一个这样的数组:
const arr = [2, 3, 4, 12, 4, 55, 8, 16]
我想得到数组产品的每五个元素的总和。 我目前的方法是使用五次for循环来计算结果。 这是神圣的狗屎! 有没有一种优雅的方法来解决它?
输出应与以下方法相同:
function getSum(arr) {
let sum = 0
for (let i = 0; i < arr.length - 4; i++) {
for (let j = i + 1; j < arr.length - 3; j++) {
for (let k = j + 1; k < arr.length - 2; k++) {
for (let l = k + 1; l < arr.length - 1; l++) {
for (let m = l + 1; m < arr.length; m++) {
sum += arr[i] * arr[j] * arr[k] * arr[l] * arr[m]
}
}
}
}
}
return sum
}
上面给出的示例的可能元组:
2 3 4 12 4
2 3 4 12 55
2 3 4 12 8
2 3 4 12 16
2 3 4 4 55
2 3 4 4 8
2 3 4 4 16
2 3 4 55 8
2 3 4 55 16
2 3 4 8 16
2 3 12 4 55
2 3 12 4 8
2 3 12 4 16
2 3 12 55 8
2 3 12 55 16
2 3 12 8 16
2 3 4 55 8
2 3 4 55 16
2 3 4 8 16
2 3 55 8 16
2 4 12 4 55
2 4 12 4 8
2 4 12 4 16
2 4 12 55 8
2 4 12 55 16
2 4 12 8 16
2 4 4 55 8
2 4 4 55 16
2 4 4 8 16
2 4 55 8 16
2 12 4 55 8
2 12 4 55 16
2 12 4 8 16
2 12 55 8 16
2 4 55 8 16
3 4 12 4 55
3 4 12 4 8
3 4 12 4 16
3 4 12 55 8
3 4 12 55 16
3 4 12 8 16
3 4 4 55 8
3 4 4 55 16
3 4 4 8 16
3 4 55 8 16
3 12 4 55 8
3 12 4 55 16
3 12 4 8 16
3 12 55 8 16
3 4 55 8 16
4 12 4 55 8
4 12 4 55 16
4 12 4 8 16
4 12 55 8 16
4 4 55 8 16
12 4 55 8 16
答案 0 :(得分:0)
您可以使用迭代和递归方法,通过检查所需长度并再次调用该函数,并将元素放在索引处或不使用。
function getCombinations(list, size) {
function fork(index, values) {
if (values.length === size) {
result.push(values);
return;
}
if (index >= list.length) {
return;
}
fork(index + 1, values.concat(list[index]));
fork(index + 1, values);
}
var result = [];
fork(0, []);
return result;
}
var result = getCombinations([2, 3, 4, 12, 4, 55, 8, 16], 5),
sum = result.reduce((s, a) => s + a.reduce((a, b) => a * b), 0);
console.log(sum); // 2927456
console.log(result.length); // 56
console.log(result.map(a => a.join(' ')));
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;