2014-02-11 54 views
3

下面是一个函数,它返回JavaScript中给定数字的主要因素。 我没有写这个函数,但一直在研究它来扩展我的编程知识。if语句中的while循环的功能是什么? JavaScript

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

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

问题

  1. 什么是while循环的目的,如果有后无码?
  2. 当while循环评估为真时发生了什么?
  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; 
} 

感谢您的帮助!

+2

它改变'x'的值。 [While](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/while)循环将继续循环,直到其条件评估为false。 – Teemu

回答

2

据真正做这样的事情递增到x在条件的权利,所以不需要一个机构。循环将执行到x < rootnum % x不成立。身体没有任何指示。

它非常相似,当你为循环

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

看到有在for循环体中没有说明执行,但仍将对循环添加一个到我直到i >= n会发生什么。

+0

呃,其实不是。 '(num%x)'将使用当前的'x',并且'(x = x + 2) kapa

+0

@kapa感谢您指出了这一点。编辑答案。 – Joel

+1

仍然不完全正确。即使“x + 2

2

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

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

1

其实有一件事情在循环发生的事情:

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

x = x + 2是赋值,你可以看到它是不是一个=====运营商,但一个=

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

通常不推荐在whileif语句的条件部分使用赋值,因为它会使代码变得不可读。

if(num % x){ 

    x = 3; 

    while(num % x){ 

     x = x + 2; 

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

} 

除,加入二:

+0

如果downvoter表达了他的理由,我会很乐意提高我的答案。 – kapa

0

x的值(由2),直到它比根的值等于或大于

2

此代码实际上是说,如果x是不是3整除,再加入2x并继续如果所得到的值小于root。只要其中一个条件不再成立,循环就会终止,但是,同时,x已被更新。

请注意,x = x + 2的计算结果为分配的左操作数。

+0

在原始代码中,即使“x + 2”小于“root”,也会将“2”添加到“x”,因为在与“root”进行比较之前会执行该添加。 –

+0

措辞不妙。我会重新说话。 –

1

while声明确实改变了x变量的值。它可以被重写为如下所示:

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

我完全错过了=(作业)vs ==(比较)。 我被抛出是因为我从未见过没有身体的循环。 谢谢这个解决方案正常工作,并且更容易可视化。 – JaredRogers

0

while条件/循环中有一个赋值。它在循环运行时进行评估,因此每个循环更新“x”的值,直到不再有< root(除了/和:& & num%x < root)。

非常聪明,但我希望这不是一个介绍文本/书/岗位编程。

+2

不,这不是初学者的书。我一直在做欧拉项目的问题,当我陷入困境时,我搜索了一些我自己无法完成的功能。然后我将它们分开并评估它们以扩展我对这个主题的认识。 – JaredRogers

0

看起来你的挂断是因为while语句中没有主体。理解循环体是可选的,它的行为与具有body的循环相同。

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

向@Teemu发放“达到或”

+2

实际上当'x'达到或超过'root'时,或者直到'num%x === 0'。 – Teemu