2015-09-26 66 views
2

我確定這是一個非常基本的問題,但無法理解爲什麼下面的FOR循環有效?Java For Loop條件測試

下面的代碼帶回了一組Prime,並按照它應該的方式工作。我理解使用平方根的整個數學推理,然而我的問題更多的是FOR語句的條件部分。

送入isPrime()檢查的第一個參數是2,當然是Prime。第一個isPrime()得到2的平方根〜1.4。
在這一點上,我感到困惑。從i = 2開始,明顯大於1.4,因此我的起始條件= root(即2 < = 1.4)未被滿足。 IF聲明不應該運行,它應該返回沒有結果,但它確實。

在我看來,我不應該得到任何結果,直到我達到5,因爲2也超過3的平方根。我顯然沒有低估FOR的初始化或條件方面聲明在這裏?有人可以幫助我的邏輯?

class BooleanTest{ 
    public static void main(String[] arguments) { 
      int quantity = 10; 
      int numPrimes = 0;     
      int candidate = 2; //starting prime # 
      System.out.println("First " + quantity + " primes:"); 
      while (numPrimes < quantity) { 
       if (isPrime(candidate)) { //if isPrime Method true 
        System.out.println(candidate); 
        numPrimes++; 
       } 
       candidate++;     
      } 
    }  

    public static boolean isPrime(int checkNumber) { 
     double root = Math.sqrt(checkNumber); //get square root of candidate 
     for (int i = 2; i <= root; i++) { 
      if (checkNumber % i == 0) { //if remainder of candidate/i = 0 
      return false; //because candidate is not prime. has factor other than 1 and self. 
     } 

     return true; 
    } 
} 

回答

3

對於輸入1,2,3,事實上,循環根本不會執行。因此,循環體中的return false語句也不會執行。相反,循環後的return true語句將被執行,對於這些輸入,方法調用的結果將爲true

的量,循環將執行第一數目是4,並且該方法將正確地返回false作爲圖4是通過divideable 2.

固定代碼的縮進使得此行爲有點更容易地看到:

public static boolean isPrime(int checkNumber) { 
    double root = Math.sqrt(checkNumber); //get square root of candidate 
    for (int i = 2; i <= root; i++) { 
     if (checkNumber % i == 0) { //if remainder of candidate/i = 0 
      return false; //because candidate is not prime. has factor other than 1 and self. 
     } 
    } 
    return true; 
} 
+0

謝謝塞巴斯蒂安!因此,將for循環放在for循環之外,但仍在方法體內,即使for循環從未啓動,也會使布爾方法「default」爲true。這很有道理。謝謝! – user3095951

0

root未初始化到sqrt(2),它初始化爲sqrt(checkNumber),這將對於大多數輸入是大於2。因此你的假設是錯誤的。