如何替换loop =>使用map(),filter()或reduce()
等方法算法
const sumAll = (arr) => {
let sum = 0
if (arr[0] > arr[1]) [arr[0], arr[1]] = [arr[1], arr[0]]
for( let i = arr[0]; i <= arr[1] ; i ++) sum += i
// replace for loop
return sum
}
console.log(sumAll([1, 4]));
console.log(sumAll([10, 5]));
&#13;
答案 0 :(得分:2)
您可以Gauss sum formula使用triangular number,其中1
到n
的所有数字都与n * (n + 1) / 2
类似。然后你需要减去之前找到的所有1
... n - 1
。
+---- 10 ---+ +------- 45 --------+ | | | | 1 2 3 4 5 6 7 8 9 10 | | +------ 15 -----+ | | +---------------- 55 ---------------+
function sumAll(array) {
var min = Math.min(...array),
max = Math.max(...array);
return max * (max + 1) / 2 - (min - 1) * min / 2;
}
console.log(sumAll([1, 4]));
console.log(sumAll([10, 5]));
&#13;
使用reduce来创建临时数组。
function sumAll(array) {
var min = Math.min(...array),
max = Math.max(...array),
array = Array.from({ length: max - min + 1 }, (_, i) => min + i);
return array.reduce((a, b) => a + b);
}
console.log(sumAll([1, 4]));
console.log(sumAll([10, 5]));
&#13;
答案 1 :(得分:0)
如果您愿意,可以使用Array.apply()
和map()
,然后使用reduce()
。
const sumAll = (arr) => {
if (arr[0] > arr[1]) [arr[0], arr[1]] = [arr[1], arr[0]]
/*No idea why I am doing it :(*/
return Array.apply(null, Array(arr[1] - arr[0] + 1)).map((_, i) => arr[0] + i).reduce((e,s) => e+s,0);
}
console.log(sumAll([1, 4]));
console.log(sumAll([10, 5]));
&#13;