Java bei Rekursiven Aufrufen

Ich habe eine Technische Frage.

Wenn ich in Java eine Rekursion Implementiere und den Rekursiven Methodenaufruf (also den Methodenaufruf der eigenen Methode) ans Ende der Methode packe, behält Java dann pro Aufruf eine Kopie der Methode im Speicher oder nicht (Manche Programmier Sprachen tun dies ja und manche eben nicht)? Vermutungen helfen mir nicht weiter, da ich diese in den letzten Tagen schon zu hauf gehört habe.
Es geht darum ob sich komplexe KI Probleme mit Rekursionen in Java abbilden lassen oder gleich der Speicher nicht mehr ausreicht.

Gruß
Christian

Hi Christian!

Eine Kopie der Methode??? Welche Programmiersprache macht denn bei Rekursion eine Kopie der Methode??? Oder versteh ich dich da falsch??
Was passiert ist folgendes: Es wird die Rücksprungadresse auf den Stack gelegt und für jeden Methodenaufruf werden die lokalen Variablen der Methode auf dem Stack angelegt. Je nachdem, wie groß der Speicherplatzbedarf deiner lokalen Variablen ist, geht das natürlich unter Umständen mächtig auf die Ressourcen.
Sollte es tatsächlich Implementationen von Programmiersprachen geben, die diese Ressourcen wegoptimieren, dan ist das auf jeden Fall Sache des Compilers und nicht Prinzip der Sprachdefinition. Bei der Ausnutzung von Compiler-Spezifischen Eigenschaften währe ich echt vorsichtig!

ABER:
Wenn deine Rekursion immer nur am Ende stattfindet, dann ist es überhaupt kein Problem die Rekursion in eine Iteration umzuwandeln!
Die Methode wird nicht von sich selbst aufgerufen, sondern von dem Programmteil, der mit dem Aufruf angefangen hat. Die ehemals Rekursive Methode muss dann nur noch mitteilen, ob bereits das Ende erreicht ist.
Vorteil: Hier spart man enorm Speicher. Nur eine Rücksprungadresse und nur ein Satz lokaler Variablen im Stack.

Selbst wenn du auf deine Rekursion bestehen willst, ist es hier ein einfaches, die benötigten Variablen für die Methode global zu machen (static). Da der eine Durchlauf ja am Ende ist werden die Variablen ja wohl nicht mehr gebraucht und können für die nächste Rekursion genutzt werden.
Vorteil: nur noch ein Satz an Variablen
Nachteil: bleibt das Problem mit der Rücksprungadresse

Gruß
Benky

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin,

Wenn ich in Java eine Rekursion Implementiere und den
Rekursiven Methodenaufruf (also den Methodenaufruf der eigenen
Methode) ans Ende der Methode packe, behält Java dann pro
Aufruf eine Kopie der Methode im Speicher oder nicht (Manche
Programmier Sprachen tun dies ja und manche eben nicht)?
Vermutungen helfen mir nicht weiter, da ich diese in den
letzten Tagen schon zu hauf gehört habe.

Sorry, ich habe auch nur eine Vermutung: Warum sollte die Funktion kopiert werden, bevor sie erneut ausgeführt wird? Ich kann mir nicht vorstellen, daß die Entwickler von Java sich die Mühe machen, etwas zu implementieren, daß für jedermann ein Nachteil wäre.

Thorsten

Moin,

Eine Kopie der Methode??? Welche Programmiersprache macht denn
bei Rekursion eine Kopie der Methode???

Ich würde bei Self oder sogar Smalltalk damit rechnen. Da sind Methoden Objekte.

Selbst wenn du auf deine Rekursion bestehen willst, ist es
hier ein einfaches, die benötigten Variablen für die Methode
global zu machen (static).

Wieso statisch?

Thorsten

Moin,

Eine Kopie der Methode??? Welche Programmiersprache macht denn
bei Rekursion eine Kopie der Methode???

Ich würde bei Self oder sogar Smalltalk damit rechnen. Da sind
Methoden Objekte.

Ich kenn mich mit Smalltalk nicht aus, aber würde mich sehr wundern. Es ist in allen Objektorientierten Sprachen so, dass die Methoden mit zum Objekt gehören, aber da werden in der Regel nur Referenzen gespeichert/kopiert. Und das je Objekt und nicht je Methodenaufruf.

Selbst wenn du auf deine Rekursion bestehen willst, ist es
hier ein einfaches, die benötigten Variablen für die Methode
global zu machen (static).

Wieso statisch?

Weiss nich! Ich glaub da hat mir C++ einen Streich gespielt. Da kann man Variablen in der Methode statisch machen, damit alle Funktionsaufrufe mit den gleichen Variablen arbeiten. In Java geht das nich. Einfach die Variablen im Objekt anlegen.

Gruß
Benky

Moin,

Es ist in allen Objektorientierten Sprachen so, dass
die Methoden mit zum Objekt gehören

Ja, aber mindestens in Self sind Methoden Objekte. Es kann natürlich sein, daß der Compiler das wegoptimiert.

Weiss nich! Ich glaub da hat mir C++ einen Streich gespielt.
Da kann man Variablen in der Methode statisch machen, damit
alle Funktionsaufrufe mit den gleichen Variablen arbeiten.
In Java geht das nich.

Zum Glück.

Thorsten