Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
kleine Frage, wie performancelastig sind rekursive Funktionen in Java? Angenommen ich hab eine Funktion, der ein Wert zugewiesen wird. Mit diesem Wert wird dann gerechnet und dann folgt mit dem neuen wert der Rekursionsaufruf, solange, bis eine Abbruchbedingung erreicht wird. Da ich nicht weiß, wie groß die zahl ist, könnte das Argument auch sehr hoch sein, wodurch der Stackframe ziemlich wachsen müsste.
Wenn du nicht weisst, wie gross die Anzahl Aufrufe können wird, dann ist Rekursion villeicht nicht die beste Lösung. Gibt es einen Grund, warum das nicht iterativ funktioniert?
Naja es kann unter Umständen verdammt schnell den Rahmen sprängen. Da gibt es auch ein Basic Beispiel dazu was das sehr gut zeigt. Versuch beispielsweise einfach mal die Fibonacci Zahlen rekursiv zu lösen.
Da wirst du schon ganz schnell merken wie schnell es explodiert.
Du musst unterscheiden ob du eine endrekursive Funktion hast oder nicht. Bei ersteren tritt dieses Performance Problem nicht auf. Endrekursion ? Wikipedia
Es gibt surchaus Rekursionen, die annähernd genauso schnell ablaufen wie ihre expliziten Äquivalente. Oftmals ist das Umwandeln in eine iterative oder gar eine explizite Form auch gar nicht möglich (sehr kostspieleig), also ist eine pauschale Aussage nur schwierig zu treffen. Hauptargument bleibt aber tatsächlich die Zahl der Widerholungen, die du möglichst gering halten solltest...
Erzähl nicht son Käse... Das hat weniger mit der Sprache als mit der Definition der Funktion zu tun.
HimBromBeere hat gesagt.:
Es gibt surchaus Rekursionen, die annähernd genauso schnell ablaufen wie ihre expliziten Äquivalente. Oftmals ist das Umwandeln in eine iterative oder gar eine explizite Form auch gar nicht möglich (sehr kostspieleig)
??? Man kann jede rekursive Berechnung auch Iterativ machen. Umgekehrt genauso. Ich verstehe dein Arguement mit "sehr kostspielig" auch nicht. In welchem Kontext bist du da gerade?
..., also ist eine pauschale Aussage nur schwierig zu treffen. Hauptargument bleibt aber tatsächlich die Zahl der Widerholungen, die du möglichst gering halten solltest...
Sowohl die Rekursionstiefe (was du mit der Zahl der Wiederholungen ansprichst) als auch die Anzahl der Argumente und Variablen die eine Funktion hat tragen zum Stackoverflow bei. Desto mehr Argumente und Variablen eine Funktion übergibt bzw. hat, desto mehr Variablen müssen beim rekursiven Aufruf auf den Stack geschrieben werden.
Im allgemeinen gilt eigentlich für Java das man für Fälle in dennen es zur sehr hohen rekursionstiefen kommen kann lieber Iterative Lösungen wählt. Java ist für sich gesehen nicht für rekursion Optimiert. Sowas findet man eher in funktionalen Programmiersprachen wie Lips und Scheme etc. vor.
Erzähl nicht son Käse... Das hat weniger mit der Sprache als mit der Definition der Funktion zu tun.
??? Man kann jede rekursive Berechnung auch Iterativ machen. Umgekehrt genauso. Ich verstehe dein Arguement mit "sehr kostspielig" auch nicht. In welchem Kontext bist du da gerade?
Sowohl die Rekursionstiefe (was du mit der Zahl der Wiederholungen ansprichst) als auch die Anzahl der Argumente und Variablen die eine Funktion hat tragen zum Stackoverflow bei. Desto mehr Argumente und Variablen eine Funktion übergibt bzw. hat, desto mehr Variablen müssen beim rekursiven Aufruf auf den Stack geschrieben werden.
Im allgemeinen gilt eigentlich für Java das man für Fälle in dennen es zur sehr hohen rekursionstiefen kommen kann lieber Iterative Lösungen wählt. Java ist für sich gesehen nicht für rekursion Optimiert. Sowas findet man eher in funktionalen Programmiersprachen wie Lips und Scheme etc. vor.
Das schon, aber es gibt durchaus Fälle in denen eine Rekursion gegen eine Iteration auszutauschen total bescheuert wäre. Wie bereits gesagt, ist das vom jeweiligen Fall abhängig. Im allgemeinen kann man sagen,dass Rekursion sehr schick sein kann, aber auch sehr schnell eine gewaltige Komplexität erreichen können. Doch sieht man sich beispielsweise die Teile- und Herrsche Algorithmen (Divide &Conquer) an,so ist die Rekursion einen wesentlichen Anteil an wirklich guten Algorithmen hat.
Aber letztlich sollte man ez mal zur Antwort auf die Frage zurückkommen.
Zum einen kann man deutlich sagen ja, sie sind performance lastig...aber dies gilt nicht im allgemeinen. viele sachen sind durch rekursion eleganter zu lösen.
Mit kostspielig meine ich v.a. die Implementierungszeit, da iterative Lösungen meist deutlich mehr Hirnmasse beanspruchen und daher Zeit kosten (welche sich bekanntermaßen in Geld umrechnen lässt, wenn man´s unbedingt will). Und wenn man einen Fertigungszeitpunkt hat, dann zählt in erster Liste erst mal, ob´s funktioniert, sprich die vorhandene Lösung ist erstmal die beste...
Zum einen kann man deutlich sagen ja, sie sind performance lastig...aber dies gilt nicht im allgemeinen. viele sachen sind durch rekursion eleganter zu lösen.
Da gibts im Netz aber auch wiedersprüchliche Informationen, z.B. Programming: Optimierung von Endrekursionen in Java. Ich könnte mir aber durchaus vorstellen, dass es zwar gewisse Optimierungen gibt, dies aber nicht Bereich des Stacks passiert. Dann fliegt das Programm natürlich auch auf die Schnauze...
Da gibts im Netz aber auch wiedersprüchliche Informationen, z.B. Programming: Optimierung von Endrekursionen in Java. Ich könnte mir aber durchaus vorstellen, dass es zwar gewisse Optimierungen gibt, dies aber nicht Bereich des Stacks passiert. Dann fliegt das Programm natürlich auch auf die Schnauze...