Wie performance lastig sind rekursionen

seux

Aktives Mitglied
hallo,

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.

seux
 

faetzminator

Gesperrter Benutzer
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?
 

bLaSt

Aktives Mitglied
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.
 

HimBromBeere

Top Contributor
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...
 

Dekker

Bekanntes Mitglied
In Java gibt es keine Endrekursion.

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.
 

bLaSt

Aktives Mitglied
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.
 

HimBromBeere

Top Contributor
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.
Amen
 

Gregorrr

Bekanntes Mitglied

bERt0r

Top Contributor
Fakt ist, ob endrekursiv oder nicht ist für den Java Stack nicht relevant. Da wird nix wegoptimiert:
Java:
public class BlowUp
{
	ArrayList<Integer> list1=new ArrayList<Integer>();
	ArrayList<Integer> list2=new ArrayList<Integer>();
	
	public int blowUp(int i)
	{
		list1.add(i);
		i++;
		return blowUp(i);
	}
	
	public int blowUp2(int i)
	{
		list2.add(i);
		i=blowUp2(i);
		i++;
		return i;
	}
	
	public List<Integer> getList1()
	{
		return list1;
	}
	
	public List<Integer>getList2()
	{
		return list2;
	}
	
	public static void main(String[]args)
	{
		BlowUp blow=new BlowUp();
		try
		{
			blow.blowUp(0);
		}
		catch(StackOverflowError e)
		{
			System.out.println(blow.getList1().size());
		}
		
		try
		{
			blow.blowUp2(0);
		}
		catch(StackOverflowError e)
		{
			System.out.println(blow.getList2().size());
		}
	}
}
Bei mir kommt beide mal ungefähr das gleiche raus.
 
Zuletzt bearbeitet:
M

maki

Gast
Der Java Compiler ist nicht in der Lage Rekursion in Endrekursion zu optimieren, der JIT/Hotspot u.U. schon ;)

Ohne den -server Parameter hat man unter Windows aber nicht viel vom Hotspot Compiler ime.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O HashTable kann ohne Performance-Verlust in Multithreaded-Anwendungen eingesetzt werden. Java Basics - Anfänger-Themen 6
N Java-Performance messen Java Basics - Anfänger-Themen 1
B Performance-Vergleich mit C++ Java Basics - Anfänger-Themen 55
P Priority Queue Performance Java Basics - Anfänger-Themen 3
P Performance Array und Liste Java Basics - Anfänger-Themen 13
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
I Erste Schritte Resource Bundle - Alles in einem File oder mehrere? => Faktor Performance Java Basics - Anfänger-Themen 2
E Hilfe zur Performance Verbesserung gesucht Java Basics - Anfänger-Themen 1
G Performance - höhere Anzahl Swing Elemente Java Basics - Anfänger-Themen 5
S Performance-/Stress Test für Webanwendung Java Basics - Anfänger-Themen 2
R Datei kopieren: Performance erhöhen Java Basics - Anfänger-Themen 10
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
J Softwaresynthesizer Performance? Java Basics - Anfänger-Themen 11
I Anzahl einer Liste (Performance) Java Basics - Anfänger-Themen 2
J Performance Vergleich von if-Abfragen mit mehreren Bedingungen Java Basics - Anfänger-Themen 9
S Performance HashMap<=>Array Java Basics - Anfänger-Themen 17
J Arrays erweitern - Performance vs Speicherverbrauch Java Basics - Anfänger-Themen 6
M Einträge in Dateien zählen - Performance-Problem Java Basics - Anfänger-Themen 10
S unterschied in performance Java Basics - Anfänger-Themen 4
hdi Worst-Performance-Award für Arbeiten mit ListModel Java Basics - Anfänger-Themen 7
hdi Performance Frage (Threads,Swing) Java Basics - Anfänger-Themen 4
V Performance Lesen und Schreiben aus/in Streams Java Basics - Anfänger-Themen 4
C große Matrizen, Performance, (Pointer?) Java Basics - Anfänger-Themen 6
G import .; - Speicherauslastung, Performance Java Basics - Anfänger-Themen 14
G Performance Java Basics - Anfänger-Themen 18
C Performance IO vs. NIO Java Basics - Anfänger-Themen 5
S dynamic arrays/ performance Java Basics - Anfänger-Themen 2
RaoulDuke Arbeitsweise / Speichernutzung / Performance Java Basics - Anfänger-Themen 10
K Warum sind Werte in den Feldern ? Java Basics - Anfänger-Themen 2
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
Igig1 Welche Werte sind als default Werte in einem Array, der als Datentyp eine Klasse hat? Java Basics - Anfänger-Themen 1
X Wie erreiche ich, dass ein Robot weitere Attribute hat, die nicht materialisiert sind, sondern nur über get/ set-Methoden simuliert sind? Java Basics - Anfänger-Themen 1
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
C Sind die while-Schleifen richtig in for-Schleifen ersetzt worden? Java Basics - Anfänger-Themen 8
S Sind unten stehende Anweisungen kompilierbar? Java Basics - Anfänger-Themen 7
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
mhmt_03 dafür sorgen, dass im JTextfield nur zahlen eingebbar sind Java Basics - Anfänger-Themen 9
M Warum werden character, die Leerzeichen sind, nicht korrekt verarbeitet? Java Basics - Anfänger-Themen 2
M Scannen von *.txt - Dateien; wo sind der oder die Fehler? Java Basics - Anfänger-Themen 4
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
S Laufzeit Quicksort wenn alle Elemente gleich sind Java Basics - Anfänger-Themen 4
B Sind meine If-Statements richtig angesetzt ? Java Basics - Anfänger-Themen 27
A Haben KNNs ein Gedächtnis, lernen etwas oder verändern sich, während sie nicht trainieren, aber aktiv sind? Java Basics - Anfänger-Themen 3
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
R Wozu sind Annotations da? Java Basics - Anfänger-Themen 3
H Was sind Package bei eclipse? Java Basics - Anfänger-Themen 1
V NullPointerException, wenn Key und Value null sind Java Basics - Anfänger-Themen 2
G Überprüfen ob alle Ziffern von 1-9 in einem Integer vorhanden sind Java Basics - Anfänger-Themen 6
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
J Strings sind gleich werden aber ungleich ausgewertet Java Basics - Anfänger-Themen 2
H Array mit Zahlen die durch 3 und 5 teilbar sind erstellen Java Basics - Anfänger-Themen 13
J Klassen Math && Random: wie zufällig sind Zufallszahlen? Java Basics - Anfänger-Themen 19
L Prüfe, ob die im String Array enthaltenen Strings aufsteigend sind. Java Basics - Anfänger-Themen 19
D Fehlermeldung obwohl Variablen bereits deklariert sind? Java Basics - Anfänger-Themen 14
C Tabs in JTabbedPane wechseln, wenn Tabs in eigenen Klassen sind Java Basics - Anfänger-Themen 2
Azazel Wie wichtig sind Castings in Java ? Java Basics - Anfänger-Themen 1
S Was sind Java Beans? Java Basics - Anfänger-Themen 7
S Erste Schritte Generische Klassen sind toll ....aber warum sollte ich das je benutzen? Java Basics - Anfänger-Themen 3
J Prüfen ob Arrays nur mit einem Wert belegt sind Java Basics - Anfänger-Themen 3
K Erste Schritte switch - Warum sind long/float/double/... nicht erlaubt? Java Basics - Anfänger-Themen 5
M Wie sicher sind Daten im Java Programm? Java Basics - Anfänger-Themen 9
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
P Wieviele Tage seit dem Datum vergangen sind Java Basics - Anfänger-Themen 5
P OOP Testen ob 2 Strings gleich sind Java Basics - Anfänger-Themen 8
M Welche externen Bibliotheken sind in Java sehr zu empfehlen? Java Basics - Anfänger-Themen 4
? Wie sind ESCAPE-Sequenzen (z.B \f für einen Seitenvorschub) richtig anuwenden? Java Basics - Anfänger-Themen 3
M Warum sind Strings Immutable? Java Basics - Anfänger-Themen 7
S Werte aus SingeltonKlasse sind manchmal =0 &manchmal !=0 Java Basics - Anfänger-Themen 1
M Sind solche boolean Anweisen empfehlenswert? Java Basics - Anfänger-Themen 3
F Scanner + Stringbuilder geben leeren String aus wenn Umlaute enthalten sind Java Basics - Anfänger-Themen 29
M String überprüfen ob nur Buchstaben enthalten sind? Java Basics - Anfänger-Themen 10
Kenan89 Wo sind die Java Standard Library Source Codes zu finden? Java Basics - Anfänger-Themen 5
L JDK installieren Sind in src.zip tatsächlich die verwendeten Klassen? Java Basics - Anfänger-Themen 7
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
B Funktionen programmieren, die im Hintergrund aktiv sind Java Basics - Anfänger-Themen 2
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
C hashCode() bei Klassen, die nicht immutable sind Java Basics - Anfänger-Themen 27
C Erste Schritte felder, die public final sind Java Basics - Anfänger-Themen 6
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
E Was sind Javascript und Java EE? Java Basics - Anfänger-Themen 7
C Nach Java-Installation sind Befehle erfolglos Java Basics - Anfänger-Themen 4
B Variablen Warum sind die blau Java Basics - Anfänger-Themen 2
L Liste aller Klassen die in einem Paket sind Java Basics - Anfänger-Themen 7
S Warten bis alle Threads fertig sind Java Basics - Anfänger-Themen 12
M Erste Schritte zwei Buchstaben die im String enthalten sind ausgeben Java Basics - Anfänger-Themen 21
J Drei Errors sind drei zuviel! Java Basics - Anfänger-Themen 25
RySa Input/Output Datei kann nicht gelöscht werden, obwohl Streams geschlossen sind. Java Basics - Anfänger-Themen 2
H Wieviele Objekte gleichzeitig sind sinnvoll? Java Basics - Anfänger-Themen 4
S Dezimale Konstanten sind immer positiv oder null - was heisst das den genau? Java Basics - Anfänger-Themen 2
D Strings sind ungleich obwohl sie in der Ausgabe gleich sind Java Basics - Anfänger-Themen 10
D Sind Enums typsichere Konstanten? Java Basics - Anfänger-Themen 15
S Warum sind Attribute der Klasse java.awt.Point public? Java Basics - Anfänger-Themen 3
T Buttons (auf denen bilder sind) random vertauschen Java Basics - Anfänger-Themen 11
W Array nach Elemenden die durch 2 teilbar sind durchsehen Java Basics - Anfänger-Themen 9
N TextZeile in einzelne Strings teilen, die mit Komma getrennt sind Java Basics - Anfänger-Themen 4
L Elemente die in Array1 sind aus Array2 löschen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben