Rekursion vermeiden?

Xandaros

Mitglied
Hallo!
Ich habe gerade aus langeweile einen Brainf*ck Interpreter in Java geschrieben und mir ist dabei aufgefallen, dass ich rekursive funktionen verwenden musste.
Nun ist mir bewusst, dass der Stack relativ klein ist und ich bin deswegen immer sehr vorsichtig mit rekursiven Funktionen. Ein Stack overflow ist nichts schönes :)
(Ich weiß nicht, wie es bei Java ist, ich habe vorher in C99 programmiert. Aber diese Frage geht auch an alle Programmiersprachen, deshalb auch dieses Forum.)

Meine Fragen wären demnach:
Ist es sinnvoll Rekusion in diesem Fall (allgemein) zu vermeiden?

Wie sieht das in Java aus? Ist der Stack da auch so Begrenzt? (Läuft ja in einer VM, es wird also folglich nicht der CPU-Stack verwendet[?])

Lässt sich rekursion überhaupt immer vermeiden?

Und zu guter letzt:
Wenn man rekursive Funktionen immer vermeiden kann: Wie kann ich es in diesem Falle tun?
Mir fiel kein Ansatz ein.

Edit:
In einem Java Forum wird automatisch Zensiert?
Ich dachte immer in solchen Forum ist das niveau generell höher o_O

Ich hoffe ihr könnt mir helfen.
Vielen Dank für eure Zeit :)
 
Zuletzt bearbeitet:
B

bygones

Gast
keine ahnung wie gross der stack ist, fuer alle bisherigen nicht endlosrekursionen hatte ich noch nie ein problem gehabt.

rekursion kann man meistens per iteration auch loesen - das kannst probieren. ebenso hilft endrekursion....
 
N

nillehammer

Gast
Aus Speichersicht ist eine Rekursion nicht wesentlich problematischer als eine Iteration. Als Maßstab würde ich hier eher die Lesbarkeit des Codes sehen. Wenn Du z.B. in einer baumartigen Datenstruktur "hinabsteigen" willst, kann das mit rekursiven Aufrufen sehr schön und verständlich gelöst werden.
 

Tobse

Top Contributor
Java wirft eine Stack-Overflow Exception wenn der Stack überläuft. Wie mein Vorredner schon sagte, musst du schon sowas anstellen, um den Stack zu sprengen:
Java:
void a() {
    b();
}
void b() {
    a();
}
Aber die kannst du abfangen, sprich
Java:
try {
    a();
} catch (StackOverflowException ex) {
    System.out.println("Stack overflow");
}
Ich denke das kannst du so in deinen Interpreter übernehmen und ich glaube nicht, dass jemals ein bedacht geschriebener code das dann sprengt - und wenn doch stürzt höchstens die VM ab, nicht aber die CPU.
 

strade87

Mitglied
Hallo zusammen...bin eben erst auf diesen Thread gestoßen, daher die später Antwort :)
Ich würde an deiner Stelle versuchen Rekusionen zu vermeiden...zumindest dort, wos nicht absehbar ist, ob und wann die Rekursion endet.
Nach allem was ich gelesen habe, unterstützt Java keine Tail Call Optimization, was wohl mit dem Sicherheitsmodell der JVM zusammenhängt...da scheiden sich aber die Geister. Eine klare Aussage habe ich dazu aber auch nicht gefunden.
MfG
strade
 

Ähnliche Java Themen


Oben