【问题标题】:What does var prime = num != 1; mean?var prime = num != 1; 是什么意思?意思是?
【发布时间】:2012-12-14 21:26:20
【问题描述】:

我知道这类似于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;
}

但我还是想知道为什么或者如何这行代码会这样。

【问题讨论】:

  • 基本上prime 是一个布尔值,就像你想的那样,num 是你检查它是否是素数的数字。
  • 啊,我现在明白了。我认为素数是数字的持有者,而不是布尔值。

标签: javascript


【解决方案1】:

正如您正确思考的那样,语句var prime = num != 1; 将布尔表达式(num != 1) 的结果分配给变量prime。这种特殊情况包含在每种质数检查代码中,因为1 本身不是质数。

如果您只检查不超过输入值平方根的除数,您的算法可能会更快。您可以阅读此here 并可能会注意到检查num &gt; i*i 是否比sqrt(num) &gt; i 更有效。

此外,如果您输入负值或零值,您所拥有的算法仍然可能返回错误值。

【讨论】:

  • 其实num == 1会跳过循环。循环以i = 2 开头,2 NOT 小于 1。所以... 这对性能来说还不错,只是对可读性不利。
  • 这是真的。我的坏我有点困惑;)我调整了我的答案。然而,当它足以检查要检查的数字的平方根时,循环到数字本身仍然很糟糕。
【解决方案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; 
}

您也可以在 i 大于 num / 2 时退出循环以提高效率。

【讨论】:

  • @s1lence - 实际上,它会跳过循环,因为 i 从 2 开始,即 NOT 小于 1 ;)
【解决方案3】:

1 is not a prime number

这是一个边缘情况检查,因为for(i = 2;..)(下)“跳过”1:因为循环永远不会运行,prime 只设置一次false(这是i != 1 的评估,当i = 1)。

但是,我觉得它令人困惑并且会使用:

if (i <= 1) {
  return false;
} else {
  // other stuff
}

【讨论】:

  • 我意识到 1 不是素数。我的问题是“这行代码是做什么的?”
  • @NickG。我忘记了不是每个人都明白x op y 只是 JavaScript 中的一个表达式(并且表达式计算为可以分配给变量的值等):-/
  • 同意您的代码更具可读性。这就是为什么你几乎总是应该(在我看来)选择以最易读的方式编写你的代码。否则,人们会阅读您的代码、摸不着头脑、在 StackOverflow 上提出问题,并浪费本可用于维护的时间!
【解决方案4】:

那行代码的重点是实现两个目标合而为一:

  • 首先,他们需要创建一个布尔变量
  • 其次,他们需要检查数字是否为1,那么它不是素数

他们只是同时做这两件事。

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多