2016-11-25 65 views
0

這裏是一個任務:這是一個有效的while循環嗎?

「比方說,給你一個號碼,和你想找到它的 平方根一個這樣做的方式是從一個非常粗略的估計大約 了答案, X0,然後使用以下公式 X1 =(X0 + A/X0)/ 2

例如改善的猜測,如果我們想找到9的平方根,並且我們先從X0 = 6, 那麼x1 =(6 + 9/6)/ 2 = 15/4 = 3.75,這更接近 我們可以重複這個程序,用x1來計算x2,依此類推,在這個 的情況下,x2 = 3.075和x3 = 3.00091。所以這是收斂的g很快就在 的正確答案(這是3)。

編寫一個名爲squareRoot的方法,該方法以雙精度參數和 爲參數,使用此技術返回參數平方根的近似值。您不得使用Math.sqrt

作爲初步猜測,您應該使用/ 2。你的方法應該迭代,直到 它得到兩個連續的估計相差小於0.0001;在其他 字樣,直到絕對值小於0.0001。您可以使用 Math.abs來計算絕對值。」

這是演習旨在實踐while循環。正如你看到我做的任務,我認爲它的工作原理?但我不知道我怎麼來解決呢?換句話說,我應該在這裏提高?是否有任何其他方式以不同的方式進入循環?如何命名變量更合適?最後,是我的方法好還是壞嗎?

public class squareRoot { 
    public static void main(String args[]){ 
     System.out.println(squareRoot(192.0)); 
    } 

    public static double squareRoot(double a){ 

     double gs = a/2; //guess 
     double ig = (gs + (a/gs))/2; //improving guess 

     double ig1 = (ig + (a/ig))/2; //one more improving guess, ig1 

     while (Math.abs((ig-ig1)) > 0.0001){ //with ig and ig1, I am entering the loop 
      ig = (ig1 + (a/ig1))/2; 
      ig1 = (ig + (a/ig))/2; //ig1 has to be less then ig 
     } 
     return ig1; 
    } 
} 
+0

您可以命名任何你想要的變量。如果您不確定代碼的功能,請編寫一些測試用例 –

+0

如果您需要撰寫評論以說明縮寫的含義,則可能不應使用縮寫。調用變量'guess'。長名稱比不清楚的短名稱更好。 – Carcigenicate

+0

你會看到'ig =(gs +(a/gs))/ 2'和'ig1 =(ig +(a/ig))/ 2'在循環的內部和外部是如何複製的?這意味着你可能應該使用'do ... while'循環。不過你需要重寫一下。 – Carcigenicate

回答

2

你的做法是近正確

讓我們先談談變量IMO,你應該使用全名變量而不是首字母縮略詞。使用guess而不是gs。使用improvedGuess而不是ig

現在,我們可以看到你的問題在哪裏。對於while循環完成,兩次連續猜測的差值必須小於0.0001。但是,這裏只是比較第一次和第二次猜測,第三次和第四次猜測,第五次和第六次猜測等。如果第四次和第五次猜測的差值小於0.0001,該怎麼辦?你的循環不會停止。相反,它返回第6個猜測的值。雖然它更準確,但不符合要求。

下面是我想出

public static double squareRoot(double a){ 

    double guess = a/2; 
    double improvedGuess = (guess + (a/guess))/2; 

    while (Math.abs((guess - improvedGuess)) > 0.0001){ 
     guess = improvedGuess; 
     improvedGuess = (guess + (a/guess))/2; 
    } 
    return improvedGuess; 
} 
+0

我知道我的代碼正在發生什麼,但是我不能像你那樣把它寫成文字!你的方式更好一些,我猜:) – Miljan

+0

如果你認爲我的答案回答你的問題,請考慮通過點擊勾號@Miljan – Sweeper

-1

這裏是我的解決方案

private static double squareRoot(double a){ 

    double x0= a/2; 
    while (true) { 
     double x1 = (x0 + a/x0)/2; 

     if (Math.abs(x1 - x0) < 0.0001) { 
      break; 
     } 
     x0=x1; 
    } 
    return x0; 
} 
+0

來接受它。使用'while(true)'和'break ;」在循環內。您應該創建一個臨時布爾值並使用適當的命名變量。 – Odrai

+0

你是絕對正確的,但是這個問題來自「Think Java」這本書。我根據書中練習中的變量命名變量。 –

相關問題