Endrekursiv vs Rekursiv

M

Mart

Gast
Also ich versteh den Unterschied nicht warum man etwas endrekursiv machen sollte wie zb

Java:
    public static int fak(int n , int akk) {
        return n != 0 ? fak(n-1, akk*n) : akk;
    }
im gegensatz zu

Java:
public static int fak(int n) {
return n != 0 ? n*fak(n-1) : 1;
}

ich versteh schon wie es funktioniert aber hab keinen plan warum man dieses oder jenes hernehmen sollte
bzw was die begründung wäre sich für eines zu entscheiden
 

httpdigest

Top Contributor
Endrekursionen kann man _immer_ in eine äquivalente iterative Schleifen-Form ohne zusätzlichen dynamischen Speicher transformieren (zusätzlich gibt es auch Laufzeitumgebungen und Compiler, die das automatisch tun - die JVM gehört _nicht_ dazu (weswegen man auch bei eigentlich tail-recursive Methoden immer noch eine StackoverflowException bekommen kann)!). Das ist bei allgemein-rekursiven Funktionen nicht möglich. Dort braucht man im allgemeinen Fall zumindest immer einen Stack als dynamische Datenstruktur (was bei der Rekursion ja der Callstack war).
 

httpdigest

Top Contributor
der callstack kann doch auch immer noch in einen overflow enden
Bei rekursiven Aufrufen, die eben nicht durch eine automatische Compilertransformation in eine iterative Variante umgeformt wurde (wie es z.B. auch die JVM nicht tut), ja. Genau das habe ich ja auch gesagt.

Endrekursionen kann man _immer_ in eine äquivalente iterative Schleifen-Form ohne zusätzlichen dynamischen Speicher transformieren [...]. Das ist bei allgemein-rekursiven Funktionen nicht möglich.
Vielleicht störte dich ja auch die zweifache Klammerverschachtelung in meinem Satz, die ich gerade bemerkte.
 

Flown

Administrator
Mitarbeiter
Kurze Berichtigung:
- JVM (HotSpot) hat (noch) keine JIT-Optimierung für tail-recursive Funktionen
- Java Compiler hat keine Endrekursion Optimierung
- Scala, Kotlin und andere JVM Sprachen haben sehr wohl tail-recursion Optimierungen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Wie könnte man den Codeschnipsel rekursiv darstellen? Allgemeine Java-Themen 1
Aboya Kugel mit Hilfe von Dreiecken rekursiv zeichnen Allgemeine Java-Themen 2
Aboya Char Array rekursiv vergleichen Allgemeine Java-Themen 15
H Heron Verfahren Tail-rekursiv lösen Allgemeine Java-Themen 7
Kingamadeus2000 Alle mehrfach vorkommenden Buchstaben rekursiv aus einem String entfernen. Allgemeine Java-Themen 6
I Diskussion zu: Tribonacci Folge Rekursiv Allgemeine Java-Themen 15
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
D 2,3-Baum rekursiv erstellen Allgemeine Java-Themen 20
denny86 NetBeans Ordnernamen rekursiv auslesen und in Variable verarbeiten Allgemeine Java-Themen 38
B Primfaktorzerlegung Rekursiv Allgemeine Java-Themen 2
B Primzahltest rekursiv Allgemeine Java-Themen 15
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
L Alle möglichen Additionen (Rekursiv) Allgemeine Java-Themen 3
N Rekursiv Höhe Baum Allgemeine Java-Themen 3
H Vektor rekursiv erzeugen Allgemeine Java-Themen 2
J Breitensuche in Graph rekursiv Allgemeine Java-Themen 2
E ordner rekursiv durchsuchen Allgemeine Java-Themen 6
E Ordner rekursiv kopieren Allgemeine Java-Themen 8
R synchronized methode rekursiv aufrufen Allgemeine Java-Themen 5
S MergeSort iterativ und rekursiv? Allgemeine Java-Themen 8
G Array rekursiv durchlaufen Allgemeine Java-Themen 2
S JAVA JTree rekursiv umschreiben Allgemeine Java-Themen 5
leifg Rekursiv mit Threads Programmieren Allgemeine Java-Themen 2
sparrow Ant build-files rekursiv aus ant aufrufen Allgemeine Java-Themen 3
K zinsen rekursiv/iterativ Allgemeine Java-Themen 17
K Verzeichnis rekursiv aus JAR-Datei extrahieren Allgemeine Java-Themen 6
F Filelisting iterativ, nicht rekursiv Allgemeine Java-Themen 7
L Spielerei: Frame rekursiv darstellen Allgemeine Java-Themen 3
M Rekursiv Verzeichnisse ansehen und auf Muster matchen Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben