我知道这与another SO question类似,但变量prime
应该是除1
以外的任何数字,并且在我看来它会被赋予布尔值num != 1
。谁能告诉我这行代码到底在做什么?
以下是使用它的代码
function isPrime( num ) {
var prime = num != 1; // Everything but 1 can be prime
for ( var i = 2; i < num; i++ ) {
if ( num % i == 0 ) {
prime = false;
break;
}
}
return prime;
}
修改 我假设这行是这样的:
if( num != 1) {
prime = num;
}
但我仍然想知道为什么或 这行代码如何做到这一点。
答案 0 :(得分:2)
换句话说:
如果num == 1,请将 prime 设置为false并跳过循环。
否则,进入循环并使用标准逻辑确定 prime 的值。
这样做是因为标准逻辑(循环内部)不适用于数字1。
因此,正如pst所说,你检查循环外的边缘情况。
这有助于在循环内保持逻辑清洁。
为了使它更具可读性(并且对所有值都正确),我会像这样重写它:
function isPrime( num ) {
if (num <= 1) {
return false;
}
for ( var i = 2; i < num; i++ ) {
if ( num % i == 0 ) {
return false;
}
}
return true;
}
一旦我大于num / 2
,您也可以退出循环,以提高效率。
答案 1 :(得分:2)
正如您所想的那样,语句var prime = num != 1;
将布尔表达式(num != 1)
的结果赋给变量prime
。这种特殊情况包含在每个主要检查代码中,因为1
本身不是素数。
如果只检查输入值的平方根除数,那么算法可能会更快。您可以阅读有关此here的信息,并且可能会注意到检查num > i*i
是否比sqrt(num) > i
更有效。
此外,如果您将其提供给负值或零值,您所拥有的算法仍可能返回错误的值。
答案 2 :(得分:1)
这是一个边缘案例检查,因为for(i = 2;..)
(下面)“跳过”1:因为循环永远不会运行,prime
只设置一次false
(这是评估当i != 1
)时i = 1
。{/ p>
然而,我发现它令人困惑,并会使用:
if (i <= 1) {
return false;
} else {
// other stuff
}
答案 3 :(得分:1)
该代码行的目的是在一个目标中实现两个目标:
他们只是同时做两件事。