public class Wurzel extends MiniJava { public static void main(String[] args) { double e = readDouble("Näherungswert für die Berechnung der Wurzel:"); write(wurzel(2.0, e)); } public static double wurzel(double a, double e) { return wurzel(a, e, a); // Wir nehmen an, die Wurzel aus a wäre a. Hier kann man jede beliebige // positive Zahl schreiben, allerdings geht die Berechnung so im Schnitt // (für Werte >0 <1 und Werte >1) am schnellsten. } public static double wurzel(double a, double e, double x) { if (x*x > a-e && x*x < a+e) { // -> Rekursionsanker: Abweichung von a um minimal e return x; // x stimmt näherungsweise } // else / sonst: // Berechne Wurzel rekursiv genauer: // Wir haben unser x(n) (als Variable x) gegeben, welches wir in die // Heron-Formel einsetzen und so x(n+1) bekommen (als Variable x_nPlus1). // Das Ergebnis (x(n+1)) wird dann rekursiv (d. h. an dieselbe Methode) // übergeben. // Hier wird dann wieder dasselbe gemacht: Es wird also erneut // überprüft, ob das x(n+1) (welches dann natürlich wieder als x(n) // gespeichert wird) nah genug berechnet wurde. // Falls ja, wird es zurückgegeben und wir erhalten es hier (als return), // geben es dann entsprechend auch wieder zurück (da ja gefunden). // Falls nein, wird dort erneut x(n+1) berechnet, was aus der aktuellen // Sicht x(n+2) entsprechen würde - usw. double x_nPlus1 = 0.5 * (x + a/x); return wurzel(a, e, x_nPlus1); } }