作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到,当有更好的选项可用时,我的算法解决方案通常包括丑陋的嵌套 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;
最佳答案
我不知道是否还有其他好的解决方案,但我想出了这个。还有一个 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)
该行创建一个具有传递参数范围的数组。如果num
为5
,它将创建以下数组:[0, 1, 2, 3, 4, 5]
。我找到了这个here .
然后我使用 filter
函数删除所有非素数。如果过滤器函数返回false
,则该数字将从数组中删除。因此,在过滤函数中,我们检查当前数字是否是素数。如果是,则返回true
。正如你所看到的,我在这里仍然使用普通的 for 循环。
不,您可以按如下方式调用该函数:primes(28);
这将返回以下数组:[ 2, 3, 5, 7, 11, 13, 17, 19, 23 ]
在这种特定情况下,我想说使用普通的 for 循环是绝对可以的。但在操作数组时,请始终考虑使用 map
、reduce
或 filter
等函数。
关于Javascript 避免嵌套 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43129567/
我是一名优秀的程序员,十分优秀!