Rekursion Wurzel

baker333

Bekanntes Mitglied
Guten Abend,

erstmal vielen Dank für all die Hilfe in den verschiedenen Themen hier.
Als nächstes soll ich eine rekursive Methode für das folgende Nährungsverfahren erstellen:

Die n-te Näherung der Quadratwurzel von a ist wie folgt definiert:

x_(n+1) = (x_n + (a/ x_n))/2

Wenn ich mich jetzt richtig erinnere, dann handelt es sich um das Heron-Verfahren.
Bei bspw. rekursiven Methoden zu den Fibonacci Zahlen oder der Fakultät hatte ich keine Probleme. Allerdings weiß ich nun wirklich nicht, wie ich den Basisfall definieren soll.
Die Methode soll wie folgt aussehen:

Java:
public double berechneWurzel(double a, int n){
}
 

JCODA

Top Contributor
Du musst dir offensichtlich Gedanken um x_0 machen, denn für x_n benötigst du x_(n-1). Und dementsprechend um z.B. x_5 aufzurechnen musst du x_4,x_3,x_2,x_1 berechnen und für x_1 brauchst du eben x_0.
Ein Blick ins Wiki hilft:
Der Startwert
86f21d0e31751534cd6584264ecf864a6aa792cf
der Iteration kann, solange er nicht gleich Null ist, beliebig festgesetzt werden, die Iteration konvergiert immer. Zu beachten ist, dass bei negativen Startwerten die Iteration gegen die negative Quadratwurzel konvergiert. Eine qualifizierte Schätzung für den Startwert erhält man aus der Taylorreihen-Entwicklung der binomischen Reihe um 1, deren zwei erste Glieder diese Gleichung liefern:
1ecb9f960f6d570b5d43b88c210bb1690d093830
 

baker333

Bekanntes Mitglied
Ich bin überfordert. Es werden doch einzelne Nährungen addiert? Ähnlich wie bei dem rekursiven Fibonacci Algorithmus muss immer vorher n-1 berechnet werden, oder?
 

JCODA

Top Contributor
Das stimmt, das n wird, zumindest laut deiner Methoden-Signatur, in jedem Schritt um eins reduziert. Das a bleibt allerdings konstant.
 

baker333

Bekanntes Mitglied
Gut, a ist natürlich konstant, weil daraus will ich ja die Wurzel ziehen. Wenn dann der Basisfall:
Java:
if (n==0){
     return 1;
}

dann muss ich danach mittels return die Methode wieder aufrufen?
 

JCODA

Top Contributor
dann muss ich danach mittels return die Methode wieder aufrufen?

Ich denke du meinst das Richtige, die Ausdrucksweise ist allerdings nicht richtig.
Zeig doch einfach mal wie du jetzt weitermachen würdest :)

Zu deinem Basisfall: Ja der funktioniert. (Ist aber laut Wiki-Zitat oben nicht optimal, return (a+1)/2; wäre besser.)
 

baker333

Bekanntes Mitglied
Java:
publich double berechneWurzel (double a, int n){
//Basisfall definieren
       if (n==0){
            return a;
       else { 
       return (n+(a/n))/2 * berechneWurzel(a, n-1);
}
 

httpdigest

Top Contributor
Wenn du für x_0 = a nimmst, wirst du feststellen, dass du noch eine Sonderbehandlung einführen musst für den Fall, dass a = 0 ist. Denn sqrt(0) = 0.
Bei x_0 = 1 oder x_0 = (a+1)/2 bräuchtest du diese nicht.

Bezüglich deines Codes oben: Nein. Hast du das mal selbst ausprobiert?
In der Formel `(x_n + a / x_n) / 2` ist `x_n` nicht `n`, sondern das Ergebnis der Näherung in Stufe `n`.
 

baker333

Bekanntes Mitglied
Wenn du für x_0 = a nimmst, wirst du feststellen, dass du noch eine Sonderbehandlung einführen musst für den Fall, dass a = 0 ist. Denn sqrt(0) = 0.
Bei x_0 = 1 oder x_0 = (a+1)/2 bräuchtest du diese nicht.

Bezüglich deines Codes oben: Nein. Hast du das mal selbst ausprobiert?

Die Sonderbehandlung brauche ich laut Aufgabenstellung nicht, aber ich weiß was Du meinst.

Wo genau liegt der Fehler im Code?
 

baker333

Bekanntes Mitglied
Sorry, ich bin überfragt, ich weiß nicht wie ich das vorherige Ergebnis dort richtig einbringe, da in der Ausgangsformel ja X_n+1 steht, meine Methode allerdings auf n-1 ausgelegt ist.
 

baker333

Bekanntes Mitglied
Java:
publich double berechneWurzel (double a, int n){
//Basisfall definieren
       if (n==0){
            return a;
       else {
       return (berechneWurzel(a, n-1) + a /berechneWurzel (a, n-1)) /2;

}
 

httpdigest

Top Contributor
Du brauchst hier keine dynamische Programmierung oder Memoization...
Schau mal, du hast vereinfacht gesehen genau diesen Fall (mit <+> als einen Stellvertreter für eine beliebige Operation):
Java:
return ziemlichKostspieligeMethode(n)
   <+> ziemlichKostspieligeMethode(n);
Du hast also zwei Aufrufe der exakt selben Methode mit den exakt selben Argumenten. Ja, wie würde man das denn jetzt ändern, dass du nur noch einmal `ziemlichKostspieligeMethode(n)` aufzurufen brauchst?
 

httpdigest

Top Contributor
Ne, das glaub ich jetzt nicht. Darauf musst du jetzt kommen. Das kann doch nicht sein.
Mal eine komplett davon losgelöste Frage:
Java:
/**
 * Läuft sehr lange und berechnet für dasselbe `a` (Parameter) _IMMER_ dasselbe Ergebnis.
 */
public static double gaaanzLangeBerechnung(double a) {
  ...
}
public static double f() {
  return gaaanzLangeBerechnung(1) + gaaanzLangeBerechnung(1);
}
Bekomme es irgendwie hin, dass in f() die Methode gaaanzLangeBerechnung() nur noch einmal aufgerufen wird.
 

JCODA

Top Contributor
Du musst nicht zweimal auf die Methode zugreifen, du musst nur einmal auf die Methode zugreifen ... und zweimal auf den Rückgabewert. Hilft das?
 

httpdigest

Top Contributor
Ein Dozent in meiner ehemaligen Uni würde jetzt sagen, dass das davon kommt, wenn man Studenten/Schüler zuerst mit imperativen Programmiersprachen (wo Methoden Seiteneffekte haben können) statt mit puren funktionalen Sprachen (in denen Ausdrücke referenzielle Integrität besitzen - und man gleiches mit gleichem ersetzen kann) bekannt macht.
 

baker333

Bekanntes Mitglied
Ich muss zu meiner Verteidigung sagen, dass das ein Kurs an der FernUni Hagen ist und ich mir das alles selber beibringe und an die Skripte gebunden bin. Im richtigen Leben bin ich Biochemiker.
 

httpdigest

Top Contributor
Japp, oder äquivalent: Stell dir vor, du hättest die eigentliche Formel `(x_n + a/x_n) / 2` in einer separaten/weiteren Methode ausgelagert, was vielleicht eine gute Idee ist, z.B. so:
Java:
private static double f(double a, double x_n) {
  return (x_n + a / x_n) / 2;
}
 

httpdigest

Top Contributor
Ganz genau! Mit dem großen Unterschied: Wie oft würdest du dort dann deine `berechneWurzel` Methode rekursiv aufrufen, um das Ergebnis als Argument für den Methodenaufruf von f(...) mitzugeben?
 
X

Xyz1

Gast
Ein Dozent in meiner ehemaligen Uni würde jetzt sagen, dass das davon kommt, wenn man Studenten/Schüler zuerst mit imperativen Programmiersprachen (wo Methoden Seiteneffekte haben können) statt mit puren funktionalen Sprachen (in denen Ausdrücke referenzielle Integrität besitzen - und man gleiches mit gleichem ersetzen kann) bekannt macht
Aber man könnte entgegnen dass dieser Effekt "nur" bei partiellem Lernen der "imperativen Sprachen" einsetzen würde. :oops: Also sprich es geht "nur" um die "vollumfänglichen" Kenntnisse der Grundlagen. :eek:
 

httpdigest

Top Contributor
Das Problem ist, dass es so etwas notwendiges wie Aktionen mit Nebeneffekten gibt, wie etwa auf der Konsole etwas ausgeben, einen HTTP-Request machen oder den Benutzer etwas fragen. Imperative Sprachen sind um die Idee herum entstanden, dass jede Aktion im Prinzip inhärent einen Nebeneffekt darstellt, bis herunter zu Instruktionen, die Register in der CPU ändern. Und jedes Programm muss wissen, welche Änderungen wie vorgenommen wurden. Entsprechende Compiler übernahmen dann diesen Job zumindest für Register und heute muss man wissen, dass es Variablen gibt, die als veränderbarer und potenziell gemeinsam genutzter Speicherplatz existieren und immer im Vordergrund der imperativen Programmierung stehen.
Im Gegensatz dazu sind funktionale Programmiersprachen nicht so sehr von der von Neumann Architektur und der Idee, Variablen/Speicherplätze zu lesen und zu modifizieren und durch Zustandsänderungen motiviert, sondern von der Idee mathematischer Ausdrücke. Natürlich werden solche Programme nach unten hin auch in zustandsändernde Maschineninstruktionen übersetzt, aber kontrolliert, so dass der Programmierer sich nicht darum zu kümmern braucht und hier keine Fehler machen kann.
Beide Seiten haben sich gegenseitig viel eingestanden und mittlerweile viel voneinander übernommen. So ziemlich jede imperative Programmiersprache besitzt heute funktionale Aspekte und fast jede funktionale Sprache besitzt Elemente, die Berechnungen mit Nebeneffekten ausdrücken.
Ich kann hier nur allerwärmstens den sehr guten Vortrag über die Evolution von Haskell empfehlen, der auch sehr für Haskell-Neulinge interessant ist:
 

baker333

Bekanntes Mitglied
Vielen Dank Euch! Ich schaue mir das morgen nochmal an und dann werde ich bestimmt eine Lösung finde. Weitere Aufgaben warten dann ja auch schon :p
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
M Variablen Rekursion mit 2 Parameteren Java Basics - Anfänger-Themen 4
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
M Lösungsweg Rekursion Java Basics - Anfänger-Themen 1
C StackOverflow bei Rekursion Java Basics - Anfänger-Themen 7
D Rekursion - Ich raffs nicht Java Basics - Anfänger-Themen 16
N Methoden Rekursion mit Kreisen Java Basics - Anfänger-Themen 7
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
J Rekursion Java Basics - Anfänger-Themen 22
T Rekursion Programmierverständnis Java Basics - Anfänger-Themen 12
K Rekursion: Rechenmauer mit Array erstellen Java Basics - Anfänger-Themen 17
K Rekursion einer Zahlenfolge (Ab- und Aufzählung) Java Basics - Anfänger-Themen 6
Zeppi Rekursion Java Basics - Anfänger-Themen 15
V Backtracking und Rekursion Java Basics - Anfänger-Themen 15
L REKURSION Java Basics - Anfänger-Themen 13
Kirby.exe Rekursion Java Basics - Anfänger-Themen 7
N for Schleife durch Rekursion ersetzen Java Basics - Anfänger-Themen 6
X Rekursion Java Basics - Anfänger-Themen 3
H Rekursion Java Basics - Anfänger-Themen 2
D Erste Schritte Rekursion Java Basics - Anfänger-Themen 13
M Rekursion Tage Ansteckung gesamte Bevölkerung Java Basics - Anfänger-Themen 15
M Java Rekursion Java Basics - Anfänger-Themen 9
G Java Rekursion Java Basics - Anfänger-Themen 5
J Rekursion Klausur Aufgabe Java Basics - Anfänger-Themen 2
N Rekursion Java Basics - Anfänger-Themen 18
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
X Rekursion Rätsel Java Basics - Anfänger-Themen 4
N Klassen Rekursion mit Feldern von Objekten Java Basics - Anfänger-Themen 14
W Rekursion Java Basics - Anfänger-Themen 0
D Konsolenausgabe Zahlenfolge Rekursion Java Basics - Anfänger-Themen 3
J Ping Pong Methode mit Rekursion Java Basics - Anfänger-Themen 1
N Rekursion Java Basics - Anfänger-Themen 1
B Rekursion Basic Java Basics - Anfänger-Themen 15
O Rekursion Mergesort Java Basics - Anfänger-Themen 18
G Rekursion Java Basics - Anfänger-Themen 20
M Rekursion Java Basics - Anfänger-Themen 7
F Hilfe bei Rekursion... Java Basics - Anfänger-Themen 4
A Mit Rekursion Zufallszahlen erstellen und größte finden Java Basics - Anfänger-Themen 5
O Rekursion ordentlich aufschreiben Java Basics - Anfänger-Themen 2
B Rekursion verstehen Java Basics - Anfänger-Themen 4
O Rekursion Java Basics - Anfänger-Themen 2
E Rekursion verstehen. Java Basics - Anfänger-Themen 4
E Rekursion Kisten befüllen Java Basics - Anfänger-Themen 10
E Rekursion verstehen Java Basics - Anfänger-Themen 2
O Rekursion, String Java Basics - Anfänger-Themen 8
N Invertierte Rekursion??? Java Basics - Anfänger-Themen 5
M Bitte um Hilfe bei Quellcode (Rekursion) Java Basics - Anfänger-Themen 6
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
L Rekursion im Baum Java Basics - Anfänger-Themen 9
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
L Rekursion Baumknoten Java Basics - Anfänger-Themen 8
L Rekursion größtes Zeichen Java Basics - Anfänger-Themen 8
L Rekursion Modulo Java Basics - Anfänger-Themen 7
I Rekursion Java Basics - Anfänger-Themen 11
H Rekursion Java Basics - Anfänger-Themen 7
N Methoden zur Rekursion (catalansche Zahlen) Java Basics - Anfänger-Themen 4
S Frage zu Rekursion... Java Basics - Anfänger-Themen 15
N Java catalansche Zahlen (Rekursion) Java Basics - Anfänger-Themen 5
S Noch eine Frage zur Rekursion... Java Basics - Anfänger-Themen 11
S Frage zu einer Rekursion Java Basics - Anfänger-Themen 15
F Methoden Abbruchbedingung bei Rekursion Java Basics - Anfänger-Themen 2
Z Rekursion Primzahlen Java Basics - Anfänger-Themen 1
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
M Rekursion Minimums Suche Java Basics - Anfänger-Themen 12
J Rekursion Java Basics - Anfänger-Themen 5
F Aufgabe Rekursion Binärer Baum Java Basics - Anfänger-Themen 15
N Rekursion Java Basics - Anfänger-Themen 2
B Rekursion - Übung Java Basics - Anfänger-Themen 2
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
P Rekursion Java Basics - Anfänger-Themen 19
G Rekursion Beispiel Java Basics - Anfänger-Themen 3
M Rekursion schreiben Java Basics - Anfänger-Themen 16
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
T Array Rekursion Java Basics - Anfänger-Themen 1
B lineare und schlichte Rekursion Java Basics - Anfänger-Themen 1
A Rekursion Java Basics - Anfänger-Themen 2
B Rekursion Java Basics - Anfänger-Themen 3
A Rekursion stoppt an der falschen Stelle Java Basics - Anfänger-Themen 4
A Lineare Rekursion Java Basics - Anfänger-Themen 6
P Hilfe zur Rekursion? Java Basics - Anfänger-Themen 2
B Rekursion Schneeflocke - Kurze Frage zur Methode Java Basics - Anfänger-Themen 11
L Rekursion Java Basics - Anfänger-Themen 4
S Rekursion Rückgabe - Türme von Hanoi Java Basics - Anfänger-Themen 16
kilopack15 Rekursion und Schleifen Java Basics - Anfänger-Themen 27
E Rekursion Java Basics - Anfänger-Themen 10
G rekursion nicht verstanden Java Basics - Anfänger-Themen 5
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
E Methoden String wird in Rekursion nicht überschrieben Java Basics - Anfänger-Themen 2
T 2fach Rekursion. Java Basics - Anfänger-Themen 4
N Rekursion mit if-Anweisung Java Basics - Anfänger-Themen 10
K Methoden Zahlensysteme umwandeln mittels Rekursion Java Basics - Anfänger-Themen 5
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
P Methoden Primzahltest mit Rekursion Java Basics - Anfänger-Themen 3
C Rekursion überführen in eine normale methode Java Basics - Anfänger-Themen 1
M Methoden Rekursion nachvollziehen Java Basics - Anfänger-Themen 4
C Rekursion Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben