我接受了一个小测验,我得到了错误的答案,因此我一直在烦我,所以我想我会问你的想法
我需要优化以下功能
function sumOfEvenNumbers(n) {
var sum = 0;
for(let i = 2; i < n;i++){
if(i % 2 == 0) sum += i;
}
return sum;
}
console.log(sumOfEvenNumbers(5));
我想出了
function sumOfEvenNumbers(n) {
var sum = 0;
while(--n >= 2) sum += n % 2 == 0? n : 0
return sum;
}
console.log(sumOfEvenNumbers(5));
还有其他方法吗?
答案 0 :(得分:3)
n个数字的总和:
var sum = (n * (n+1)) / 2;
n个偶数的总和:
var m = Math.floor(n/2);
var sum = 2 * (m * (m+1) /2);
答案 1 :(得分:3)
这是一个数学问题。总和似乎是arithmitic sequence的总和,常见差异为2
。总和是:
sum = N * (last + first) / 2;
其中N
是序列中的数字,last
是这些数字的最后一个数字,first
是第一个。
转换为javascript:
function sumOfEvenNumbers(n) {
return Math.floor(n / 2) * (n - n % 2 + 2) / 2;
}
因为2
和n
之间的偶数为Math.floor(n / 2)
且最后一个偶数为n - n % 2
(7
为7 - 7 % 2 === 6
}和8
将是8 - 8 % 2 === 8
)。第一个是2
。
答案 2 :(得分:2)
您可以使用恒定时间的算术和公式计算这些总和:
// Return sum of positive even numbers < n:
function sumOfEvenNumbers(n) {
n = (n - 1) >> 1;
return n * (n + 1);
}
// Example:
console.log(sumOfEvenNumbers(5));
&#13;
以上计算避免了模乘和除法运算符,它比乘法,加法和位移消耗更多的CPU周期。但请注意位移运算符>>
的{{3}}。
参见例如对于此公式和其他公式,limited range会产生相同的结果。
答案 3 :(得分:1)
首先要消除循环中的测试:
function sumOfEvenNumbers(n) {
var sum = 0;
var halfN= Math.floor(n/2);
for(let i = 1; i < n/2;i++) {
sum += i;
}
return sum * 2;
}
然后我们可以观察到,这只是计算所有整数 less 的总和而不是一个极限 - 并且有一个公式(但实际上公式是 less-equal 极限)。
function sumOfEvenNumbers(n) {
var halfNm1= Math.floor(n/2)-1;
var sum = halfNm1 * (halfNm1+1) / 2;
return sum * 2;
}
然后消除除法和乘法以及不必要的加法和减法:
function sumOfEvenNumbers(n) {
var halfN= Math.floor(n/2);
return (halfN-1) * halfN;
}
答案 4 :(得分:1)
您的解决方案以线性(O(N))时间计算。
如果使用数学解,可以在O(1)时间内计算:
function sum(n) {
let half = Math.ceil(n/2)
return half * (half + 1)
}
答案 5 :(得分:0)
因为问题标记为ecmascript-6:)
const sumEven = x => [...Array(x + 1).keys()].reduce((a, b) => b % 2 === 0 ? a + b : a, 0);
// set max number
console.log(sumEven(10));
&#13;