Gibt es Probleme, die nicht geschrieben werden kann mit tail-Rekursion?

Tail-Rekursion ist ein wichtiger performance-Optimierung stragegy in funktionalen Sprachen, denn es erlaubt rekursive Aufrufe verbrauchen Konstante stack (anstatt O(n)).

Gibt es irgendwelche Probleme, die einfach nicht geschrieben werden kann in eine tail-rekursive Stil, oder ist es immer möglich, zu konvertieren, eine naiv-rekursive Funktion in eine tail-rekursive einer?

Wenn das so ist, eines Tages möglicherweise funktional-Compiler und-Interpreter intelligent genug, um die Konvertierung automatisch?

  • Ich bin nicht einverstanden, dass tail recursion ist ein performance-Optimierung. Es hat zu tun mit der Richtigkeit: Programmierung in einer Sprache ohne dies verhindert, dass Sie von der Behandlung der unbegrenzten Wiederholung mit Rekursion, in der Erwägung, dass in Sprachen mit dieser Funktion, Sie sind frei, verwenden Sie die Rekursion (mit gewissen Einschränkungen) für unbegrenzte Wiederholung. Dies ist ein wichtiger Punkt: Die (Garantie -) Vorhandensein von tail-Rekursion ändert sich die Semantik der Sprache.
  • Wie ändert sich die Semantik? Die gleiche abstrakte Berechnung ist beschrieben in jedem Fall. Die zeitliche und räumliche Komplexität der resultierende code ist wohl eine Implementierung detail, wenn auch ein wichtiger, wenn Sie erwarten, um wirklich das Programm ausführen.
  • Ich sollte vielleicht qualifiziert haben, dass es Veränderungen der Semantik, wenn Sie eine statische Stapel, die ich verstehen ist Normalfall, z.B. mit Java können Sie übergeben Sie einen Parameter beim Start der jvm, wie groß der stack sein soll, aber der Stapel kann nicht wachsen und wachsen, bis die Maschine die Speicher aufgebraucht ist. Sie sprechen von der abstrakten Berechnung, und Sie sind in einem gewissen Sinne richtig, aber dies ist ein klassisches Beispiel einer "leaky abstraction": Das zugrunde liegende Implementierung übt sich, und ohne eine Garantie für tail-calls, die der Programmierer kann sich auf Sie verlassen.
InformationsquelleAutor ctford | 2009-12-11
Schreibe einen Kommentar