我注意到,当有更好的选项时,我的算法解决方案通常包含丑陋的嵌套for循环。在下面的示例中,如何在没有嵌套循环的情况下确定给定参数的素数?赋值的一个约束是不使用任何外部函数。
function sumPrimes(num) {
var p = [];
for (var i = 2; i <= num; i++)
{
p.push(i);
for (var j = 2; j < i; j++)
{
if (i % j === 0) //not a prime
{
p.pop(i);
break;
}
}
}
return p;
答案 0 :(得分:0)
我不知道是否有其他好的解决方案,但我想出了这个。还有一个for循环;)
function primes(num) {
return Array.apply(null, {length: (num + 1)}).map(Number.call, Number)
.filter(function(n) {
for(var i = 2; i < n; i++) {
if(n % i === 0) return false;
}
return n !== 0 && n !== 1;
})
}
说明:
Array.apply(null, {length: (num + 1)}).map(Number.call, Number)
此行创建一个具有传递参数范围的Array。如果num
为5
,则会创建以下数组:[0, 1, 2, 3, 4, 5]
。我找到了here。
然后我使用filter
函数删除所有非素数。如果过滤器函数返回false
,则数字将从数组中删除。因此,在过滤器函数中,我们检查当前数字是否为素数。如果是,则返回true
。正如你所看到的,我仍然在这里使用普通for循环。
不,你可以按如下方式调用该函数:primes(28);
这将返回以下数组:[ 2, 3, 5, 7, 11, 13, 17, 19, 23 ]
在这种特殊情况下我会说使用normal for循环是绝对可以的。但是,当您对数组进行操作时,请始终考虑map
,reduce
或filter
等函数。