2016-04-17 6 views
0

私が働いている問題を推測する再帰的な平方根のための基本ケースが何であるかを把握する方法この:プログラム

次のような方法が 平方根を計算するために古代ギリシャ人に知られていました。値x> 0と平方根の推測gを仮定すると、 は(g + x/g)/ 2となる。再帰ヘルパーメソッドpublic static squareRootGuess(double x、double g)を書く。 g^2がxに等しい約 である場合は、gを返します。そうでない場合は、 の推測でsquareRootGuessを返します。次に、ヘルパーメソッドを使用するpublic static squareRoot(double x) メソッドを記述します。

私はここで何をやっているのか分かりません。私は、私のベースケースがこの機能に対して正しいとは思わない。私は問題が何を求めているのかをよく把握していません。

public class rootchecker { 

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

    // helper 
    public static double squareRoot(double x) 
    { 
     return squareRootGuess(x, x-1); 
    } 

    // recursive 
    public static double squareRootGuess(double x, double g) 
    { 
     if (x == 1) 
     { 
      return 1; 
     } 
     else 
     { 
      double ans = (g + (x/g)/2); 
      return squareRootGuess(x-1, ans); 
     } 
    } 


} 

更新:

私は私の基本ケースを固定しています。私のコードは次のようになりました:

public class rootchecker { 

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

    // helper 
    public static double squareRoot(double x) 
    { 
     return squareRootGuess(x, x-1); 
    } 

    // recursive 
    public static double squareRootGuess(double x, double g) 
    { 
     if (Math.abs(Math.sqrt(x) - g) < 0.001) 
     { 
      return g; 
     } 
     else 
     { 
      double ans = (g + (x/g)/2); 
      return squareRootGuess(x, ans); 
     } 
    } 


} 

引き続き、問題を解決するために、私のロジックは正しいですか?スタックオーバーフローエラーが発生したと考えて、それは信じられません。

+0

それをg^2はxにほぼ等しい場合は、 'グラムを返すべきときに出て書いた文章で述べている、G'戻る – JackVanier

+0

だから、それはだ単に'場合(X == Math.sqrt(2.0)) ; '? – Matt

+0

彼らはおおよそ等しいと言ったので、私は ''(Math.sqrt(x)-g)<0.001) 'を書くでしょう。 – 4castle

答えて

0

if文で "<"とするのではなく、 "< ="に変更しました。

public static double squareRootGuess(double x, double g) 
    { 
     if (Math.abs(Math.sqrt(x) - g) <= 0.001) 
     { 
      return g; 
     } 
     else 
     { 
      double ans = (g + (x/g)/2); 
      return squareRootGuess(x, ans); 
     } 
    }