2016-11-25 10 views
0

は割り当てです:これは効果的なwhileループですか?ここ

「には、例えば、あなたが数与えられているとしましょう、そしてあなたはその 平方根を見つけたいことを行う1つの方法は、答え について非常にラフな推測を開始することです。 X0、その後、次の式 X1 =(X0 + A/X0)を使用して推測を改善/ 2

例えば、我々は9の平方根を検索する場合、我々はX0 = 6、 で始まります x1を使用してx2を計算するなどの手順を繰り返すことができます。この のケースでは、x2 = 3.075とx3となり、x1 =(6 + 9/6)/ 2 = 15/4 = 3.75となります。 = 3.00091。これはコンバージドなのでgは非常に迅速に 正しい答え(3)です。

テクニックを使用して、パラメータの2乗をとる というメソッドをパラメータの平方根を返します。 Math.sqrtは使用できません。

最初の推測として、/ 2を使用する必要があります。あなたのメソッドは、 まで繰り返され、0.0001未満の2つの連続した見積もりが得られます。他の ワードでは、絶対値が0.0001未満になるまで。あなたは絶対値を計算する Math.absを使用することができます。」これは演習では、ループしながら、練習を意味している

。あなたは私が割り当てをした見ての通り、私はそれがうまくいくと思う?しかし、私は解決策に来たのかわかりませんか?言い換えれば、私はここで何を改善すべきか?違ったループを入力する他の方法はありますか?より適切か、そして最後に変数に名前を付ける方法、私のアプローチで良いか、ここで悪い?

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、あなたは完全な名前を使用する必要があります変数の代わりに頭字語。 gsの代わりにguessを使用してください。 igの代わりにimprovedGuessを使用してください。

ここでは、問題がどこにあるかを確認できません。 whileループが終了するには、2つの連続する推測の差が0.0001未満でなければなりません。しかしここでは、第1と第2の推測、第3と第4の推測、第5と第6の推測などを比較するだけです。第4と第5の推測の差が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」ブックからの質問です。私は本の練習で変数にしたがって変数を命名した。 –

関連する問題