# Rekursion vermeiden?



## Xandaros (17. Feb 2012)

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 

Ich hoffe ihr könnt mir helfen.
Vielen Dank für eure Zeit


----------



## bygones (17. Feb 2012)

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


----------



## nillehammer (17. Feb 2012)

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 (17. Feb 2012)

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:

```
void a() {
    b();
}
void b() {
    a();
}
```
Aber die kannst du abfangen, sprich

```
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 (27. Feb 2012)

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


----------

