Iteration und Rekursion

Aus ProgrammingWiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Definitionen

Iteration

bezeichnet das wiederholte Durchlaufen von Anweisungen. Typischerweise wird dabei mitgezählt, wie oft die jeweilige Aktion erledigt wird.
Wir kennen dafür z.B. die Sprachkonstrukte
for und while.


Bei einer Rekursion

erfolgt die Definition eines Problems, einer Funktion oder eines Verfahrens "durch sich selbst". Es handelt sich also wieder um eine Wiederholung, aber ohne Schleife!
Das Ergebnis eines Verfahrens für die Eingabe $x$ wird auf das Ergebnis des gleichen Verfahrens für eine Eingabe $y$ zurückgeführt, das Ergebnis des Verfahrens
für die Eingabe $y$ wird 
wiederum auf das Ergebnis des Verfahrens für eine Eingabe $z$ zurückgeführt, usw.
Dabei muss mindestens für einen Wert das Ergebnis des Verfahrens bekannt sein!

Erste Beispiele

Fakultät

iterativ


Abarbeitung für n=4:

i

Ergebnis

1

1

2

2

3

6

4

24


rekursiv


Abarbeitung für n=4:

Aufruf $fak$_$rek(4):=4*fak$_$rek(3)$;

danach "Abstieg in die Rekursionstiefe":

     $fak$_$rek(4):=4*fak$_$rek(3)$; 
         $fak$_$rek(3):=3*fak$_$rek(2)$;
             $fak$_$rek(2):=2*fak$_$rek(1)$;
                $fak$_$rek(1):=1*fak$_$rek(0)$;

Für n=0 liefert das Verfahren den bekannten Wert 1.
Der rekursive "Aufstieg" liefert dann:

               $fak$_$rek(1):=1*1=1$;
               $fak$_$rek(2):=2*1=2$;
               $fak$_$rek(3):=3*2=6$;
               $fak$_$rek(4):=4*6=24$;
Das Affenmodell

Eine schöne Interpretation des rekursiven Prozeduraufrufes finden wir bei WAGENKNECHT in: Rekursionen - Ein didaktischer Zugang mit Funktionen, Dümmler Verlag, Bonn 1994.

Affenmodell1.gif

"Der Auftrag, der von außen dem höchsten Oberaffen übergeben wurde, wird von diesem nicht vollständig bearbeitet, sondern in etwas abgeschwächter Form dem untergebenen Affen übergeben. Dieser verhält sich ebenso zu seinem Untergebenen. Der letzte Affe in dieser Hierarchie kann den ihm übergebenen Auftrag erfüllen und dem übergeordneten Affen übergeben. Jeder weitere Affe hat die Pflicht, das Resultat der Erledigung seines Auftrages seinem Auftraggeber zu übergeben. Schließlich kann der Ranghöchste sein Ergebnis abliefern.
Parallelen zu Einrichtungen, Ämtern und Institutionen unserer Gesellschaft sind unbeabsichtigt oder rein zufällig."


Die Fibonaccizahlen

Leonardo Fibonacci di Pisa (* um 1180; † 1241) beschrieb die Fortpflanzung von Kaninchen mit der Zahlenfolge:

$1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...$

Definition:

$\mbox{fib}(n)=\begin{cases}1,\mbox{wenn}\hspace{0.3em}n=1\\1,\mbox{wenn}\hspace{0.3em}n=2\\\mbox{fib}(n-1)+\mbox{fib}(n-2),\mbox{sonst}\end{cases}$

Beschreibung:

Die Kaninchenpaar bekommt nach zwei Monaten Nachwuchs (Pärchen!), dies dann jeden Monat. Die "Kinderpaare" verhalten sich genauso. Die Kaninchen leben "unendlich lange".

Das bedeutet:

  • Die ersten beiden Glieder der Zahlenfolge sind jeweils 1.
  • Jedes weitere Glied ergibt sich aus der Summe seiner beiden Vorgänger.


iterativ

Zunächst eine iterative Variante:


Abarbeitung für n=5:

i

Ergebnis

f1

f2

-

1

1

1

3

2

1

2

4

3

2

3

5

5

3

5

hugo

hugo

hugo

hugo


rekursiv

Implementieren Sie nun die rekursive Variante entsprechend obiger Definition:

Turtle zeichnet rekursiv - Selbstähnlichkeit

Wir betrachten das nachfolgende Grafikobjekt, das wir als Binärbaum bezeichnen wollen.
Baum mit n=10

Dabei fällt auf, dass jeder Ast wieder ein kleiner Binärbaum ist.
Wir wollen diese Selbstähnlichkeit zu seiner Beschreibung ausnutzen:


Beschreibung:

  • Der einfachste Binärbaum (Aufruf: baum(1)) besteht aus einem Stamm.
  • Jeder andere Binärbaum besteht aus einem Stamm sowie einem vereinfachten linken und einem vereinfachten rechten Binärbaum.

Wir stellen fest, dass es durchaus sinnvoll sein kann, Objekte mit sich selbst zu beschreiben.
Dazu definiert man den Baum mit sich selbst.

Prozeduren, die mit sich selbst definiert werden, heißen rekursive1)  Prozeduren.
Rekursionen stellen ein leistungsstarkes und universelles Konzept zur Problemlösung dar.
1) recurrere (lat.): "zurücklaufen"

Zusammenfassung

Rekursion bietet sich dann an, wenn man ein gestelltes Problem durch eine Funktion schrittweise in ein etwas einfacheres Problem umwandeln kann.

typischer Aufbau einer rekursiven Funktion

  • 1. $if$-Befehl, der das Ende der Selbstaufrufe bestimmt
  • 2. ein Aufruf der Funktion selbst

Nachteile der Rekursion

  • 1. Jeder Aufruf kostet Zeit - Rekursion prinzipiell langsamer als Iteration
  • 2. jeder Aufruf kostet Speicherplatz - viel Speicher im Stack (Speicherstapel)

Jede Iteration kann als Rekursion formuliert werden, jede Rekursion als Iteration (teilweise schwierig). Rekursionen werden durch den Compiler bzw. Interpreter der Programmiersprache aufgelöst - der PC-Prozessor arbeitet iterativ.


Rekursive Folgen

weitere Hilfen und Beispiele (incl. "Bewerbungstest"); [1]

Persönliche Werkzeuge