2014-02-11 91 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