我正在尝试这个Codewars挑战,问题涉及找到一个数的除数,然后计算这些除数的平方和.我找到了解决这个问题的两种方法.
第一种方法是基于另一个关于找到所有除数之和的Stackoverflow问题,并且最初看起来很聪明:
function divisorsSquared(n) {
// create a numeric sequence and then reduce it
return [...Array(n+1).keys()].slice(1)
.reduce((sum, num)=>sum+(!(n % (num)) && Math.pow(num,2)), 0);
}
Run Code Online (Sandbox Code Playgroud)
我使用的第二种方法是使用简单的for循环:
function divisorsSquared(n) {
var sum = 0;
for(var i = 1; i<= n; i++){
if(n % i === 0) sum += Math.pow(i,2);
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
现在我注意到第一种方法明显慢于第二种方法,快速jsperf测试证实了这一点.
我的问题是:为什么第一种方法如此慢,哪种方法在生产代码中更可取?
在Codewars上我注意到,对于许多挑战,使用类似的数组方法有一些聪明的单行解决方案.作为一个初学者,即使性能更差,这些解决方案可能被认为是比for循环更好的做法吗?