www.wikidata.de-de.nina.az
Eine rekursive Funktion f ist endrekursiv englisch tail recursive auch endstandig rekursiv iterativ rekursiv repetitiv rekursiv wenn der rekursive Funktionsaufruf die letzte Aktion zur Berechnung von f ist 1 Vorteil dieser Funktionsdefinition ist dass kein zusatzlicher Speicherplatz zur Verwaltung der Rekursion benotigt wird Inhaltsverzeichnis 1 Automatisches Entfernen von endstandigen Funktionsaufrufen 2 Explizite Endrekursion 3 Anwendbarkeit und Verallgemeinerung 4 Beispiele 5 Verallgemeinerung 6 Siehe auch 7 EinzelnachweiseAutomatisches Entfernen von endstandigen Funktionsaufrufen BearbeitenBei der naiven Abarbeitung einer rekursiven Funktion steigt der Speicherplatzverbrauch linear mit der Rekursionstiefe da bei jedem Funktionsaufruf Speicherplatz fur das Aufzeichnen der aktuellen Continuation des Programmflusses und der Funktionsparameter belegt wird etwa zum Sichern der Rucksprungadresse und des aktuellen stack frame auf dem Aufrufstack Ausserdem kann wahrend der Abarbeitung der aufgerufenen Funktion weiterer Speicherplatz fur das Ablegen von funktionslokalen Variablen belegt werden Bei einem endstandigen Funktionsaufruf werden die im fur die aufrufende Funktion belegten Speicherbereich abgelegten Werte aber nur noch fur die Parameterubergabe an die endstandig aufgerufene Funktion benotigt so dass dieser Speicherbereich wiederverwendet werden kann Somit konnen endrekursive Funktionen automatisch etwa im Rahmen eines Optimierungsschrittes des Compilers in iterative Funktionen umgeformt werden deren Speicherplatzverbrauch bei der Abarbeitung unabhangig von der Rekursionstiefe ist Bei der Umformung werden die Aufrufe der endstandigen Funktion durch entsprechende Sprunganweisungen ersetzt tail call elimination Einige Programmiersprachen wie etwa Scheme verlangen die automatische Umformung von endrekursiven Funktionen in iterative Funktionen als Teil ihrer Sprachdefinition Andere Programmiersprachen wie etwa C C und C oder Java verlangen diese Umformung nicht lassen sie aber fur die jeweilige Sprachimplementierung als Optimierung zu Als Optimierung ist diese Technik haufig in Compilern fur funktionale Programmiersprachen zu finden da bei Verwendung eines funktionalen Programmierstils die rekursive endrekursive Formulierung fur viele Algorithmen besonders haufig ist und darum solchen Formulierungen im Rahmen der Programmoptimierung beim Ubersetzen durch einen Compiler besondere Beachtung zukommt Das automatische Ersetzen von Funktionsaufrufen durch Sprunganweisungen mit Wiederverwendung des aktuellen stack frame erschwert die Ablaufverfolgung eines Programms bei der Fehleranalyse da der Aufrufstack beim Unterbrechen eines laufenden Programms an einem Haltepunkt die Aufrufreihenfolge der Funktionen nicht vollstandig wiedergibt Explizite Endrekursion BearbeitenDie Programmiersprache Clojure bietet den expliziten Aufruf recur fur Endrekursion Dies hat den Vorteil dass der Compiler es erkennt wenn der Aufruf nicht aus der Endposition erfolgt und den Programmierer darauf hinweist 2 Anwendbarkeit und Verallgemeinerung BearbeitenDie Anwendbarkeit der Technik zur Ersetzung von endstandigen Funktionsaufrufen durch Sprunge ist nicht auf endrekursive Funktionen beschrankt Scheme verlangt beispielsweise auch uber Funktionsgrenzen hinweg die Ausfuhrung von endstandigen Funktionen mit konstantem Speicherplatzverbrauch proper tail recursion beispielsweise fur zwei Funktionen die einander endstandig aufrufen 3 4 Durch den Ubergang zu Continuation passing style lassen sich prinzipiell Programme so umformen dass alle Funktionsaufrufe durch endstandige Aufrufe ersetzt werden Dazu mussen jedoch alle aufgerufenen Funktionen so umgeformt werden dass sie eine Continuation als Parameter ubernehmen die sie dann explizit mit Ubergabe des Funktionsergebnisses zur Ausfuhrung des weiteren Programmlaufs endstandig aktivieren Bei der Ausfuhrung eines solchermassen umgeformten Programms wird dann konstanter Speicherplatz fur die Ablage der activation records etwa auf dem Aufrufstack benotigt aber der fur die Ablage der Fortsetzungen benotigte Speicherplatz ist nicht beschrankt Als Folge dieser Umformung ist dann die mogliche Rekursionstiefe einer Routine durch den zur Ablage der Fortsetzungen verfugbaren Speicherplatz beschrankt statt durch die Grosse des Aufrufstacks 5 Beispiele BearbeitenGegeben sei die rekursive Funktion sum die die Summe der ersten n naturlichen Zahlen berechnet sum n if n 0 return 0 else return n sum n 1 Da nicht der rekursive Funktionsaufruf sondern die Addition die letzte Aktion bildet handelt es sich nicht um eine endrekursive Funktion Die Berechnung von sum 3 wurde damit folgende Schritte beinhalten sum 3 3 sum 2 sum 2 2 sum 1 sum 1 1 sum 0 sum 0 0 sum 1 1 0 1 sum 2 2 1 3 sum 3 3 3 6 In diesem Fall ist jedoch eine Umformung in eine endrekursive Darstellung moglich sum n return add sum 0 n add sum m n if n 0 return m else return add sum m n n 1 Die endrekursive Hilfsfunktion add sum empfangt zwei Parameter m und n und liefert als Ergebnis die Summe aus m und der Summe der ersten n naturlichen Zahlen Der Aufruf add sum 0 n liefert somit das gewunschte Ergebnis die Summe der ersten n naturlichen Zahlen Wahrend des Ablaufs der Endrekursion in add sum werden die Zwischenergebnisse im m Parameter akkumuliert In dieser endrekursiven Formulierung wurde die Berechnung von sum 3 etwa folgende Schritte beinhalten sum 3 add sum 0 3 add sum 3 2 add sum 5 1 add sum 6 0 6 Bei der Umformung wurde implizit das Assoziativgesetz fur die Addition naturlicher Zahlen ausgenutzt Die ursprungliche Definition von sum n berechnete sum 3 als 3 2 1 0 Die umgeformte Formulierung berechnet denselben Wert als 0 3 2 1 Wie jede primitiv rekursive Funktion lasst sich die Endrekursion mittels Iteration darstellen sum n m 0 while n gt 0 do m m n n n 1 end while return m Rekursive wie iterative Losungen stellen meist eine direkte Umsetzung eines Problems dar welches schrittweise analysiert wurde Platzersparnis und Lesbarkeit gehen dabei auf Kosten der Ausfuhrungszeit Vielfach lohnt daher die Suche nach effizienteren Algorithmen So ist der beste Algorithmus zur Berechnung des Beispielfalles vor allem durch die Gausssche Schulgeschichte bekannt geworden sum n n n 1 2 Als Beispiel fur Endrekursion mit mehreren beteiligten Funktionen hier zwei Funktionen even und odd zur Feststellung ob eine gegebene naturliche Zahl gerade oder ungerade ist even n if n 0 return true else return odd n 1 odd n if n 0 return false else return even n 1 Die beiden Funktionen rufen sich gegenseitig endstandig auf Fur sich genommen ist keine der beiden Funktionen endrekursiv Verallgemeinerung BearbeitenAllgemein ist eine Funktion f endrekursiv wenn sie sich auf folgende Weise definieren lasst f x s x falls R x f r x sonst displaystyle f x begin cases s x amp mbox falls R x f r x amp mbox sonst end cases nbsp Dabei sind r und s beliebige nicht mittels f definierte Funktionen und R die Abbruchbedingung Siehe auch BearbeitenPlatzkomplexitatEinzelnachweise Bearbeiten Harold Abelson Gerald Jay Sussman sowie Julie Sussman Linear Recursion and Iteration Memento des Originals vom 3 September 2006 im Internet Archive nbsp Info Der Archivlink wurde automatisch eingesetzt und noch nicht gepruft Bitte prufe Original und Archivlink gemass Anleitung und entferne dann diesen Hinweis 1 2 Vorlage Webachiv IABot mitpress mit edu In Structure and Interpretation of Computer Programs Second edition The MIT Press 1996 ISBN 0 262 51087 1 recur clojure core ClojureDocs Community Powered Clojure Documentation and Examples In clojuredocs org Abgerufen am 18 Januar 2017 Richard Kelsey William Clinger Jonathan Rees et al Revised5 Report on the Algorithmic Language Scheme In Higher Order and Symbolic Computation 11 Jahrgang Nr 1 August 1998 S 7 105 doi 10 1023 A 1010051815785 schemers org William Clinger Proper tail recursion and space efficiency Memento des Originals vom 30 Oktober 2015 im Internet Archive nbsp Info Der Archivlink wurde automatisch eingesetzt und noch nicht gepruft Bitte prufe Original und Archivlink gemass Anleitung und entferne dann diesen Hinweis 1 2 Vorlage Webachiv IABot www cesura17 net PDF 240 kB Proceedings of the 1998 ACM Conference on Programming Language Design and Implementation Juni 1998 S 174 185 Daniel P Friedman Mitchell Wand Christopher T Haynes Essentials of Programming Languages Second edition MIT Press 2001 ISBN 0262062178 Abgerufen von https de wikipedia org w index php title Endrekursion amp oldid 233229028