【发布时间】:2017-05-16 17:02:09
【问题描述】:
所以我想编写一个函数,它返回所有素数之和,包括提供的数字。
我写了这个,它有效:
function sumPrimes(num) {
const arr = Array.from({length: num+1}, (v, k) => k).slice(2);
return arr.filter(element => {
for(let i = 2; i < element; i++) {
if(element % i === 0) {
return false;
}
}
return element;
}).reduce((previous, current) => {
return previous += current;
}, 0);
}
sumPrimes(9);
我认为如果将 for 循环替换为另一个数组辅助方法,它会看起来更整洁。然而,我正在努力实现这一点。
这是我目前得到的:
function sumPrimes(num) {
const arr = Array.from({length: num+1}, (v, k) => k).slice(2);
return arr.filter(element => {
return arr.find(ref => {
console.log("(" + element + " % " + ref + " === 0) " + (element % ref === 0));
if(element % ref === 0) { return false; }
return true;
});
}).reduce((previous, current) => {
return previous += current;
}, 0);
}
sumPrimes(20);
这样写,函数不再按预期工作——它不过滤任何数字,所以所有数字都由 .reduce 帮助器求和。控制台使它看起来好像 if 语句仍在按预期工作;我做错了什么?
【问题讨论】:
-
不是你问的,但是,
for(let i = 2; i < element; i++) {真的应该是for(let i = 2; i*i <= element; i++) { -
将sieve of Sundaram 实现为您的助手会更快。 Here 是一个 JS 代码。
-
感谢@WillNess!我认为没有必要担心平方根,但现在想想你说的,我可以看到它如何使函数更高效
标签: javascript arrays ecmascript-6 primes helpers