优化Javascript

时间:2017-04-27 18:24:54

标签: javascript

我接受了一个小测验,我得到了错误的答案,因此我一直在烦我,所以我想我会问你的想法

我需要优化以下功能

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));

还有其他方法吗?

6 个答案:

答案 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;
}

因为2n之间的偶数为Math.floor(n / 2)且最后一个偶数为n - n % 277 - 7 % 2 === 6 }和8将是8 - 8 % 2 === 8)。第一个是2

答案 2 :(得分:2)

您可以使用恒定时间的算术和公式计算这些总和:

&#13;
&#13;
// Return sum of positive even numbers < n:
function sumOfEvenNumbers(n) {
  n = (n - 1) >> 1;
  return n * (n + 1);
}

// Example:
console.log(sumOfEvenNumbers(5));
&#13;
&#13;
&#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:)

&#13;
&#13;
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;
&#13;
&#13;