www.wikidata.de-de.nina.az
Bei der rekursiven Programmierung ruft sich eine Prozedur Funktion oder Methode in einem Computerprogramm selbst wieder auf d h enthalt eine Rekursion Auch der gegenseitige Aufruf stellt eine Rekursion dar Wichtig bei der rekursiven Programmierung ist eine Abbruchbedingung in dieser Funktion weil sich das rekursive Programm sonst theoretisch unendlich oft selbst aufrufen wurde Rekursive Programmierung kann unter anderem in prozeduralen und objektorientierten Programmiersprachen angewandt werden Obwohl diese Sprachen in ihrem Sprachstandard die Rekursion ausdrucklich zulassen stellen Selbstaufrufe und gegenseitige Aufrufe hier aufgrund der verwendeten Programmierparadigmen jedoch eher die Ausnahme dar Auch wenn in der Praxis zur Verbesserung des Programmierstils auch hier durchaus haufig auf Rekursion zuruckgegriffen wird sind die meisten Funktionen in diesen Sprachen doch rein iterativ In einigen Sprachen wie z B in manchen funktionalen Programmiersprachen oder Makroprozessoren muss die rekursive Programmiermethode zwingend verwendet werden da iterative Sprachkonstrukte fehlen Inhaltsverzeichnis 1 Beispiele 1 1 Fakultat 1 2 Binare Suche 2 Effizienz 2 1 Fakultat 3 Implementierung 4 Siehe auch 5 WeblinksBeispiele BearbeitenFakultat Bearbeiten Ein Beispiel fur die Verwendung einer rekursiven Programmierung ist die Berechnung der Fakultat einer Zahl Die Fakultat ist das Produkt aller ganzen Zahlen von 1 bis zu dieser Zahl Die Fakultat von 4 ist also 1 2 3 4 24 displaystyle 1 cdot 2 cdot 3 cdot 4 24 nbsp Mathematiker definieren die Fakultat meistens so eine rekursive Definition Die Fakultat der Zahl 0 ist definitionsgemass 1 Die Fakultat einer ganzen Zahl die grosser als Null ist ist das Produkt dieser Zahl mit der Fakultat der nachstkleineren ganzen Zahl Die Definition funktioniert so Will man die Fakultat von 4 berechnen so muss man zunachst die Fakultat von 3 berechnen und das Ergebnis mit 4 multiplizieren Will man die Fakultat von 3 berechnen so muss man zunachst die Fakultat von 2 berechnen und das Ergebnis mit 3 multiplizieren Will man die Fakultat von 2 berechnen so muss man zunachst die Fakultat von 1 berechnen und das Ergebnis mit 2 multiplizieren Will man die Fakultat von 1 berechnen so muss man zunachst die Fakultat von 0 berechnen und das Ergebnis mit 1 multiplizieren Die Fakultat von 0 ist nach Definition 1 Die Fakultat von 1 ist also 1 1 1 dd Die Fakultat von 2 ist also 1 1 2 2 dd Die Fakultat von 3 ist also 1 1 2 3 6 dd Die Fakultat von 4 ist also 1 1 2 3 4 24 dd In einer Programmiersprache wie Pascal die rekursive Programmierung zulasst kann man die Fakultat folgendermassen eingeben Man definiert eine Funktion factorial die eine Zahl x als Eingabewert bekommt Diese Funktion multipliziert x mit dem Ruckgabewert von factorial x 1 ausser bei x 0 dann liefert die Funktion das Ergebnis 1 Dies ist die Abbruchbedingung Rekursive Implementation der Fakultatsfunktion function factorial x Integer Integer begin if x 0 then factorial 1 else factorial x factorial x 1 end Mit der Startzahl x 4 wurde der Computer rechnen 4 3 2 1 factorial 0 heraus kommt dann das richtige Ergebnis namlich 24 Binare Suche Bearbeiten Die binare Suche in einem vorsortierten Array lasst sich rekursiv implementieren Wenn das mittlere Element kleiner als das gesuchte Element ist wird die hintere Halfte des Arrays rekursiv durchsucht Wenn es grosser als das gesuchte Element ist wird die vordere Halfte des Arrays rekursiv durchsucht Ist es gleich dem gesuchten Element ist die Suche beendet Die Abbruchbedingung fur die Rekursion ist erfullt wenn das mittlere Element gleich dem gesuchten Element ist die Suche also erfolgreich ist oder wenn der Endindex kleiner als der Startindex ist die Suche also erfolglos ist Die folgende Funktion Methode fur die rekursive binare Suche ist in der Programmiersprache C int RekursiveBinaereSuche int werte int gesuchterWert int startIndex int endIndex if endIndex lt startIndex Wenn Element nicht gefunden dann null zuruckgeben return null int mittlererIndex startIndex endIndex 2 if werte mittlererIndex gesuchterWert Wenn Element gefunden dann Index zuruckgeben return mittlererIndex else if werte mittlererIndex lt gesuchterWert Rekursiver Aufruf der Funktion fur die hintere Halfte return RekursiveBinaereSuche werte gesuchterWert mittlererIndex 1 endIndex else Rekursiver Aufruf der Funktion fur die vordere Halfte return RekursiveBinaereSuche werte gesuchterWert startIndex mittlererIndex 1 Effizienz BearbeitenRekursive Programme haben in der Regel keine gute Performance Durch die wiederholten Funktionsaufrufe Inkarnationen wird immer wieder derselbe Methodeneintrittscode bearbeitet und bei jeder Inkarnation der Kontext gesichert was zu zusatzlichem Programmcode und hoherem Arbeitsspeicherverbrauch fuhrt Alle rekursiven Algorithmen lassen sich jedoch auch durch iterative Programmierung implementieren und umgekehrt Fakultat Bearbeiten Man hatte die Fakultat auch so implementieren konnen function factorial x Integer Integer var i number Integer begin number 1 for i 1 to x do number number i factorial number end Hierbei gilt die Regel dass fur einfache Probleme eine iterative Implementierung haufig effizienter ist So sollte z B auch die Fakultatsfunktion der Effizienz wegen in der Praxis iterativ implementiert werden Bei komplizierten Problemstellungen z B Aufgaben mit Baumen hingegen lohnt sich oftmals der Einsatz einer rekursiven Losung da fur solche Probleme eine iterative Formulierung schnell sehr unubersichtlich und ineffizient werden kann da im schlimmsten Fall der Stack durch den iterativen Algorithmus selbst verwaltet werden muss was sonst der Prozessor direkt erledigt Nicht alle hoheren Programmiersprachen lassen rekursive Aufrufe zu Ein Beispiel dazu ist alteres Fortran Ab Fortran 90 sind rekursive Aufrufe moglich Andere Programmiersprachen sind dagegen grundsatzlich rekursiv wie z B Prolog Solche rekursiven Programmiersprachen und auch andere Sprachen wie z B Scheme setzen die Rekursion meistens effizient um Implementierung BearbeitenRekursion wird in der Regel durch einen Stack implementiert der die Rucksprungadressen aber auch alle lokalen Variablen und eventuell Funktionsergebnisse aufnimmt Wurde man wie im obenstehenden Beispiel die Fakultat von 4 berechnen so wurde jeder Aufruf folgende Informationen auf den Stack legen Platz fur Ergebnis Argument x RucksprungadresseZunachst wurde im Hauptprogramm also fac 4 aufgerufen und damit die folgenden Informationen auf den Stack gelegt Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument Stapelzeiger displaystyle rightarrow nbsp 3 Rucksprungadresse ins HauptprogrammDie Fakultatsfunktion pruft jetzt ob das Argument 0 ist Da dies nicht der Fall ist wird 4 fac 3 berechnet Zunachst muss also fac mit dem Argument 3 aufgerufen werden Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument 3 Rucksprungadresse ins Hauptprogramm4 Platz fur Ergebnis5 3 Argument Stapelzeiger displaystyle rightarrow nbsp 6 Rucksprungadresse in die FakultatsfunktionDas Argument ist wieder ungleich 0 also geht s weiter mit 3 fac 2 Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument 3 Rucksprungadresse ins Hauptprogramm4 Platz fur Ergebnis5 3 Argument 6 Rucksprungadresse in die Fakultatsfunktion7 Platz fur Ergebnis8 2 Argument Stapelzeiger displaystyle rightarrow nbsp 9 Rucksprungadresse in die FakultatsfunktionDas Argument ist wieder ungleich 0 also2 fac 1 Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument 3 Rucksprungadresse ins Hauptprogramm4 Platz fur Ergebnis5 3 Argument 6 Rucksprungadresse in die Fakultatsfunktion7 Platz fur Ergebnis8 2 Argument 9 Rucksprungadresse in die Fakultatsfunktion10 Platz fur Ergebnis11 1 Argument Stapelzeiger displaystyle rightarrow nbsp 12 Rucksprungadresse in die FakultatsfunktionDas Argument ist wieder ungleich 0 also1 fac 0 Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument 3 Rucksprungadresse ins Hauptprogramm4 Platz fur Ergebnis5 3 Argument 6 Rucksprungadresse in die Fakultatsfunktion7 Platz fur Ergebnis8 2 Argument 9 Rucksprungadresse in die Fakultatsfunktion10 Platz fur Ergebnis11 1 Argument 12 Rucksprungadresse in die Fakultatsfunktion13 Platz fur Ergebnis14 0 Argument Stapelzeiger displaystyle rightarrow nbsp 15 Rucksprungadresse in die FakultatsfunktionJetzt ist das Argument 0 das Ergebnis also 1 Wir holen die Rucksprungadresse und das Argument vom Stack und schreiben die 1 in den dafur vorgesehenen Platz Der Rucksprung fuhrt in die Fakultatsfunktion zuruck Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument 3 Rucksprungadresse ins Hauptprogramm4 Platz fur Ergebnis5 3 Argument 6 Rucksprungadresse in die Fakultatsfunktion7 Platz fur Ergebnis8 2 Argument 9 Rucksprungadresse in die Fakultatsfunktion10 Platz fur Ergebnis11 1 Argument 12 Rucksprungadresse in die FakultatsfunktionStapelzeiger displaystyle rightarrow nbsp 13 1 Ergebnis Jetzt kann man das Ergebnis mit dem Argument multiplizieren 1 1 Das neue Ergebnis ist wieder 1 Die Rucksprungadresse und das Argument werden vom Stack geholt und das neue Ergebnis in den dafur vorgesehenen Platz geschrieben Rucksprung in die Fakultatsfunktion Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument 3 Rucksprungadresse ins Hauptprogramm4 Platz fur Ergebnis5 3 Argument 6 Rucksprungadresse in die Fakultatsfunktion7 Platz fur Ergebnis8 2 Argument 9 Rucksprungadresse in die FakultatsfunktionStapelzeiger displaystyle rightarrow nbsp 10 1 Ergebnis Wiederum wird das Ergebnis mit dem Argument multipliziert 1 2 Zuruck in die Fakultatsfunktion Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument 3 Rucksprungadresse ins Hauptprogramm4 Platz fur Ergebnis5 3 Argument 6 Rucksprungadresse in die FakultatsfunktionStapelzeiger displaystyle rightarrow nbsp 7 2 Ergebnis Das Ergebnis wird mit dem Argument multipliziert 2 3 Zuruck in die Fakultatsfunktion Stapelanfang displaystyle rightarrow nbsp 1 Platz fur Ergebnis2 4 Argument 3 Rucksprungadresse ins HauptprogrammStapelzeiger displaystyle rightarrow nbsp 4 6 Ergebnis Das Ergebnis wird mit dem Argument multipliziert 6 4 Zuruck ins Hauptprogramm StapelanfangStapelzeiger displaystyle rightarrow nbsp 1 24 Ergebnis Das Hauptprogramm muss dann nur noch das Ergebnis 24 vom Stack holen Siehe auch BearbeitenQuicksort Endrekursion Programmierparadigma EntrekursivierungWeblinks Bearbeiten nbsp Wikibooks Rekursive Labyrinthe Lern und Lehrmaterialien Abgerufen von https de wikipedia org w index php title Rekursive Programmierung amp oldid 237501072