2016-04-17 7 views
0

Das Problem Ich arbeite an dieser ist:Wie um herauszufinden, was das Basismodell für eine rekursive Quadratwurzel Programm zum Erraten

Die folgende Methode zu den alten Griechen bekannt war Quadratwurzeln für die Berechnung. Bei einem Wert x> 0 und einem Schätzwert g für die Quadratwurzel ist eine bessere Schätzung (g + x/g)/2. Schreibe eine rekursive Hilfsmethode public static squareRootGuess (double x, double g). Wenn g^2 ungefähr gleich x ist, gebe g zurück, andernfalls richte squareRootGuess mit der besser ein. Schreiben Sie dann eine Methode public static squareRoot (double x) , die die Hilfsmethode verwendet.

Ich bin mir nicht sicher, was ich hier tun soll. Ich glaube nicht, dass mein Base Case für diese Funktion korrekt ist. Ich habe kein gutes Verständnis dafür, was genau das Problem verlangt.

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); 
     } 
    } 


} 

Update:

Ich habe meine Basisfall festgelegt. Mein Code ist jetzt wie folgt:

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); 
     } 
    } 


} 

Fortsetzung auf für das Problem, ist meine Logik korrekt für die Else-Anweisung? Ich glaube nicht, dass es ist, wenn ich einen Stapelüberlauffehler erhalte.

+0

Es heißt in dem Text, den Sie geschrieben, wenn Sie g zurückgeben sollte 'Wenn g^2 ungefähr gleich x ist, kehren g' – JackVanier

+0

So einfach es ist' if (x == Math.sqrt (2.0)) ; '? – Matt

+0

Sie sagten ungefähr gleich, also würde ich 'if tun (Math.abs (Math.sqrt (x) - g) <0.001)' – 4castle

Antwort

0

Was ich getan habe, war statt mit der "<" in der if-Anweisung habe ich es in "< =" geändert und es hat funktioniert.

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); 
     } 
    } 
Verwandte Themen