【问题标题】:What is the functionality of the while loop inside the if statement? JavaScriptif 语句中的 while 循环的功能是什么? JavaScript
【发布时间】:2014-03-10 00:13:59
【问题描述】:

下面是一个在 JavaScript 中返回给定数字的质因数的函数。 我没有写这个函数,但一直在研究它以扩展我的编程知识。

我的问题是关于以下 if 语句中的 while 循环。

if(num % x){
    x = 3; 
    while((num % x) && ((x = x+2) < root));
}

问题

  1. 如果后面没有代码,while 循环的目的是什么?
  2. 当 while 循环计算结果为 true 时会发生什么?
  3. 当 while 循环评估为 false 时会发生什么?

这是完整的功能。

function getPrimeFactors(num){
    num = Math.floor(num);
    var root = 0;
    var factors = [];
    var doLoop = 1 < num;
    var x = 0;

    while(doLoop){
        root = Math.sqrt(num);
        x = 2;

        if(num % x){
            x = 3;
            while((num % x) && ((x = x+2) < root));
        }

        if(x > root){
            x = num;
        }else{
            x = x;
        }

        factors.push(x);

        doLoop = (x != num);

        num = num/x;
    }

    return factors;
}

谢谢你的帮助!!!

【问题讨论】:

  • 它改变了x的值。 While 循环将继续循环,直到其条件被评估为假。

标签: javascript while-loop


【解决方案1】:

它真的是在做这样的事情:

if(num % x){

    x = 3;

    while(num % x){

        x = x + 2;

        if(x < root)
            continue;
        else
            break;
    }

}

除了在条件句中的x 中添加了两个,因此不需要正文。循环将一直执行,直到 x &lt; rootnum % x 不成立。正文中没有任何说明。

这与执行 for 循环时发生的情况非常相似

for(int i=0; i < n; i++)
    ;

查看 for 循环体中没有任何指令,但循环仍将 i 加一,直到 i &gt;= n

【讨论】:

  • 好吧,其实不是。 (num % x) 将使用当前的x(x = x+2) &lt; root) 将使用递增的x
  • 仍然不完全正确。更新了原代码中的x 变量,即使x + 2 &lt; root 而本示例在这种情况下不会更改x
  • 我很抱歉没有花费大量时间来保证正确的输出,我更关心向 OP 解释这个概念。
  • 这是一个好方法。我们只是想帮助您的解释更准确。
  • 专用解决方案不适用于所有数字。特别是当您输入 144 时。您的示例输出 [2, 2, 2, 2, 9],它应该输出 [2, 2, 2, 2, 3, 3]。
【解决方案2】:

注意 while 语句中的 x = x+2。它反复将x 的值加2,直到while 子句评估为真。

所以没有主体的while循环会阻塞执行,直到它的子句变为真。如果您将子句中的变量作为条件的一部分进行变异,这只有是一个好主意。否则你可能会陷入无限循环。

【讨论】:

    【解决方案3】:

    这段代码实际上是说,如果x 不能被3 整除,则将2 添加到x 并在结果值小于root 时继续。一旦这些条件之一不再为真,循环就会终止,但与此同时,x 已在此过程中更新。

    请注意,x = x + 2 的计算结果是赋值的左操作数。

    【讨论】:

    • 在原始代码中,即使x + 2 小于root,也会将2 添加到x,因为在将其与root 比较之前执行了该添加。
    • 措辞不佳。我会重新措辞。
    【解决方案4】:

    那里的while 语句确实改变了x 变量的值。可以改写如下:

    if (num % x) {
        x = 3;
        if (num % x){
            do {
                x = x + 2;
            } while (num % x && x < root);
        }
    }
    

    【讨论】:

    • 我完全错过了 =(作业)与 ==(比较)。我被抛出,因为我从未见过没有身体的循环。谢谢你这个解决方案工作正常,更容易可视化。
    【解决方案5】:

    循环中实际上发生了一件事:

                           V
    while((num % x) && ((x = x+2) < root));
    

    x = x + 2 是一个赋值,你可以看到它不是===== 运算符而是=

    (x = x + 2) &lt; root 表示将x 增加2,然后将其与root 进行比较。

    通常不建议在whileif 语句的条件部分使用赋值,因为这会降低代码的可读性。

    【讨论】:

    • 如果反对者表达了他的理由,我很乐意改进我的答案。
    【解决方案6】:

    x 的值递增(2),直到等于或大于 root 的值

    【讨论】:

      【解决方案7】:

      while 条件/循环中有一个赋值。它在循环运行时进行评估,因此“x”的值每个周期都会更新,直到不再

      非常聪明,但我希望这不是编程介绍文本/书籍/帖子。

      【讨论】:

      • 不,这不是一本初学者的书。我一直在做 Project Euler 问题,当我遇到困难时,我会寻找我自己无法完成的功能。然后我将它们拆开并评估它们以扩展我对该主题的知识。
      【解决方案8】:

      您的问题似乎在于 while 语句中没有正文。了解循环体是可选的,它的行为方式与具有循环体的循环相同。

      基本上,while 循环会一遍又一遍地检查条件。是的,如果编码不正确,这可能会导致无限循环。在这种情况下,'x' 将增加 2,直到达到或超过 'root' 的值。

      感谢@Teemu 的“达到或”

      【讨论】:

      • 实际上当x达到或超过root,或者直到num % x === 0
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2013-11-01
      相关资源
      最近更新 更多