Title: Rekursion
1Rekursion
- IFB Weiterbildungslehrgang X Informatik
- Kurs 2 Thema Rekursion
- 2. 12. 2005
- Tobias Selinger
2Einleitung
- Was macht man mit einem großen Problem?
Flugzeugsimulator-Programm
?
3Modularisierung - Teile und herrsche
- Was macht man mit einem großen Problem?
Flugzeugsimulator-Programm
in Teilprobleme zerlegen
Benutzer-Oberfläche
3D-System
Spiel-Steuerung
Karten-datenbank
Landschafts-generator
Level-Editor
4Zerlegung in Teilprobleme?
4 ! 4 3 2 1 24 5 !
5 4 3 2 1 120
5Definition rekursiv lösbar
- Ein Problem ist rekursiv lösbar,falls man es in
Teilprobleme zerlegen kann, die alle - ähnlich zum Gesamtproblem sind
- kleiner als das Gesamtproblem sind
- irgendwann direkt lösbar sind
- Beispiel
- Zeichne diesen Busch!
- Ähnliche Teilprobleme ?
6Busch Teilprobleme
- Ein Problem ist rekursiv lösbar,falls man es in
Teilprobleme zerlegen kann, die alle - ähnlich zum Gesamtproblem sind
- kleiner als das Gesamtproblem sind
- irgendwann direkt lösbar sind
- Beispiel 1
- Zeichne diesen Busch!
- Ähnliche Teilprobleme
- Zeichne Teilbüsche !
- Wie ???
rechterTeilbusch
linkerTeilbusch
Level 1
7Busch Teilprobleme
- Ein Problem ist rekursiv lösbar,falls man es in
Teilprobleme zerlegen kann, die alle - ähnlich zum Gesamtproblem sind
- kleiner als das Gesamtproblem sind
- irgendwann direkt lösbar sind
- Beispiel 1
- Zeichne diesen Busch!
- Ähnliche Teilprobleme
- Zeichne Teilbüsche !
- Wie ??? Ebenso... !
Teil-busch
Teil-busch
Teilbusch
Teilbusch
Level 2
Level 1
8Busch Bildungsgesetz
- Ein Problem ist rekursiv lösbar,falls man es in
Teilprobleme zerlegen kann, die alle - ähnlich zum Gesamtproblem sind
- kleiner als das Gesamtproblem sind
- irgendwann direkt lösbar sind
- Das rekursive Bildungsgesetzfür einen Busch
lautet also
Busch ???
9Busch Bildungsgesetz
- Ein Problem ist rekursiv lösbar,falls man es in
Teilprobleme zerlegen kann, die alle - ähnlich zum Gesamtproblem sind
- kleiner als das Gesamtproblem sind
- irgendwann direkt lösbar sind
- Das rekursive Bildungsgesetzfür einen Busch
lautet also
Busch rechter Zweig rechter (Teil)-Busch
linker Zweig linker (Teil)-Busch
Beachte Endlos-Rekursion???
10Busch Bildungsgesetz
- Ein Problem ist rekursiv lösbar,falls man es in
Teilprobleme zerlegen kann, die alle - ähnlich zum Gesamtproblem sind
- kleiner als das Gesamtproblem sind
- irgendwann direkt lösbar sind
- Das rekursive Bildungsgesetzfür einen Busch
lautet also
Busch rechter Zweig rechter (Teil)-Busch
linker Zweig linker (Teil)-Busch
Beachte Wenn ein Teilbusch klein genug
ist, gilt er als abgeschlossen (ohne weitere
Folgearbeit) ! Ansonsten müsste man endlos
weiterzeichnen...
11Busch Programmierung
Programmierung derGrundstruktur
procedure busch(laenge real)begin if laenge
gt 10 then with Form1.Turtle1 do begin
turnright(20) forwd(laenge)
back(laenge) turnleft(40)
forwd(laenge) back(laenge)
turnright(20) endend
Eintrittsbedingung
??? ??? ???
12Busch Programmierung
Programmierung derGrundstruktur
procedure busch(laenge real)begin if laenge
gt 10 then with Form1.Turtle1 do begin
turnright(20) forwd(laenge)
back(laenge) turnleft(40)
forwd(laenge) back(laenge)
turnright(20) endend
Eintrittsbedingung
rechten Zweig zeichnen zurück undlinken Zweig
zeichnen zurück und geradeaus drehen(in
Ausgangsposition!)
13Busch Programmierung
Programmierung derGrundstruktur
Ergänzung derrekursiven Aufrufe
procedure busch(laenge real)begin if laenge
gt 10 then with Form1.Turtle1 do begin
turnright(20) forwd(laenge) ???
back(laenge) turnleft(40)
forwd(laenge) ??? back(laenge)
turnright(20) endend
rechten Zweig zeichnen rechten Teilbusch
zeichnen?zurück undlinken Zweig
zeichnenlinken Teilbusch zeichnen? zurück und
geradeaus drehen
14Busch Programmierung
Programmierung derGrundstruktur
Ergänzung derrekursiven Aufrufe
procedure busch(laenge real)begin if laenge
gt 10 then with Form1.Turtle1 do begin
turnright(20) forwd(laenge)
busch(...................) back(laenge)
turnleft(40) forwd(laenge)
busch(...................) back(laenge)
turnright(20) endend
rechten Zweig zeichnen rechten Teilbusch
zeichnenzurück undlinken Zweig
zeichnenlinken Teilbusch zeichnen zurück und
geradeaus drehen
15Busch Programmierung
Programmierung derGrundstruktur
Ergänzung derrekursiven Aufrufe
procedure busch(laenge real)begin if laenge
gt 10 then with Form1.Turtle1 do begin
turnright(20) forwd(laenge)
busch(laenge 0.7) back(laenge)
turnleft(40) forwd(laenge)
busch(laenge 0.7) back(laenge)
turnright(20) endend
rechten Zweig zeichnen rechten Teilbusch
zeichnenzurück undlinken Zweig
zeichnenlinken Teilbusch zeichnen zurück und
geradeaus drehen
Programm-Demo!
16Busch Aufbau der Levels
Level 1
17Busch Aufbau der Levels
Level 2
18Busch Aufbau der Levels
Level 3
19Busch Aufbau der Levels
Programm-Demo!
Level ?
Übungen!
20Übungen Spirale und Baum
- Übungen Entwickeln Sie zunächst das
Grundmuster, danach die Einstiegspunkte für
rekursive Aufrufe. Vergessen Sie nie die
Eintritts-/Abbruchbedingung! Kopieren Sie das
Delphi-Projekt Rekursion graphisch und bauen
Sie Ihre Prozeduren dort ein! Testen Sie! - spirale(laenge) erzeugt eine Spirale als
geknickte Linie(Winkel jeweils 30), deren
Linienstücke immer kürzer werden. - baum(laenge) ähnelt dem Busch, hat aber als
Grundmustereinen Stamm mit zwei Knospen.
21Übungen Kochkurve und Hutschnur
- koch(laenge) erzeugt die berühmte KochkurveDas
mittlere Drittel einer Strecke wird durch zwei
ebenso lange Dreieckseiten ersetzt, dies wird
dannauf allen vier Teilstreckendurchgeführt,
und wiederumauf deren Teilstrecken... - hutschnur(laenge) ähnelt der Kochkurve,ersetzt
das mittlere Drittel aberdurch drei
Quadratseiten,und setzt dieses Verfahrenauf
allen Teilstrecken fort.
22Übungen für Spezialisten Sierpinski und
Drachenkurve
- sierpinski(laenge) erzeugt ein gleichseitiges
Dreieck, in dessen Ecken halb so große Dreiecke
sitzen, in deren Ecken wiederum... - drache(laenge) erzeugt die berühmte
Drachenkurve, die sich aus einem geknickten
Papierstreifen ergibt Einen langen Streifen
durch Knicken sorgfältig halbieren,die beiden
übereinanderliegenden Teilstreifen wieder Knicken
...... und am Schluss den gesamten Streifen
jeweils mit 90-Knicks auseinanderfalten. Am
besten macht man es einmal vor!(Tipp Verwenden
Sie zwei Parameter drache(laenge, winkel) ,
wobei der winkel die gewünschte Knickrichtung /-
90 angibt!)
23Numerischer Einstieg Fakultätsfunktion
- Beispiel 2 Die Fakultät einer Zahl
- 4 ! 4 3 2 1 24
- Rekursion?? 5 ! 5 4 3 2 1 120
-
Test 3 ! ?1 ! ?
24Fakultät Bildungsgesetz
- Beispiel 2 Die Fakultät einer Zahl
- 4 ! 4 3 2 1 24
- 5 ! 5 4 3 2 1 120
- Rekursion 5 ! 5 4 !
- Rekursive Formel
Test 3 ! 61 ! 1
n ! ???
25Fakultät Bildungsgesetz
- Beispiel 2 Die Fakultät einer Zahl
- 4 ! 4 3 2 1 24
- 5 ! 5 4 3 2 1 120
- Rekursion 5 ! 5 4 !
- Rekursive Formel Problem Was ist
Test 3 ! 61 ! 1
n ! n (n-1) !
Rekursionsschritt
1 ! ?
26Fakultät Bildungsgesetz
- Beispiel 2 Die Fakultät einer Zahl
- 4 ! 4 3 2 1 24
- 5 ! 5 4 3 2 1 120
- Rekursion 5 ! 5 4 !
- Rekursive FormelProblem
- Lösung Für den Sonderfall n 1 ist das
Teilproblem direkt lösbar, d.h. bei n 1
erfolgt kein rekursiver Aufruf mehr! - Beachte Jeder rekursive Prozess benötigt eine
Rekursionbedingung und einen solchen Start- bzw.
Endwert, sonst gingen die rekursiven Aufrufe ins
Endlose!
Test 3 ! 61 ! 1
n ! n (n-1) ! , falls n gt 1 ist
Rekursionbedingung
Rekursionsschritt
1 ! 1
Start-/Endwert
Rollenspiel!
27Fakultät Berechnung mit rekursivem Abstieg...
- Beispiel 2 Die Fakultät einer Zahl
- 5 ! 5 4 3 2 1 120
- 5 ! 5 4 !
- 4 ! ???
Phase des rekursiven Abstiegs (rekursive
Aufrufe)
28Fakultät Berechnung mit rekursivem Abstieg...
- Beispiel 2 Die Fakultät einer Zahl
- 5 ! 5 4 3 2 1 120
- 5 ! 5 4 !
- 4 ! 4 3 !
- 3 ! 3 2 !
- 2 ! 2 1 !
- 1 ! .....
-
Phase des rekursiven Abstiegs (rekursive
Aufrufe)
29Fakultät Berechnung mit rekursivem Abstieg...
- Beispiel 2 Die Fakultät einer Zahl
- 5 ! 5 4 3 2 1 120
- 5 ! 5 4 !
- 4 ! 4 3 !
- 3 ! 3 2 !
- 2 ! 2 1 !
- 1 ! 1
-
Phase des rekursiven Abstiegs (rekursive
Aufrufe)
30Fakultät ... und Aufstieg
- Beispiel 2 Die Fakultät einer Zahl
- 5 ! 5 4 3 2 1 120
- 5 ! 5 4 !
- 4 ! 4 3 !
- 3 ! 3 2 !
- 2 ! 2 1 !
- 1 ! 1
-
Phase des rekursiven Abstiegs (rekursive
Aufrufe)
1
Phase des rekursiven Aufstiegs (Zusammenbau)
2
31Fakultät ... und Aufstieg
- Beispiel 2 Die Fakultät einer Zahl
- 5 ! 5 4 3 2 1 120
- 5 ! 5 4 !
- 4 ! 4 3 !
- 3 ! 3 2 !
- 2 ! 2 1 !
- 1 ! 1
-
Phase des rekursiven Abstiegs (rekursive
Aufrufe)
1
Phase des rekursiven Aufstiegs (Zusammenbau)
2
32Fakultät ... und Aufstieg
- Beispiel 2 Die Fakultät einer Zahl
- 5 ! 5 4 3 2 1 120
- 5 ! 5 4 !
- 4 ! 4 3 !
- 3 ! 3 2 !
- 2 ! 2 1 !
- 1 ! 1
-
Phase des rekursiven Abstiegs (rekursive
Aufrufe)
1
Phase des rekursiven Aufstiegs (Zusammenbau)
2
24
120
33Fakultät Ab- und Aufstieg
- Beispiel 2 Die Fakultät einer Zahl
- 5 ! 5 4 3 2 1 120
- 5 ! 5 4!
- 5 (4 3!)
- 5 (4 (3 2!))
- 5 (4 (3 (2 1!)))
- 5 (4 (3 (2 (1))))
- 5 (4 (3 (2)))
- 5 (4 (6))
- 5 (24)
- 120
Phase des rekursiven Abstiegs (rekursive
Aufrufe)
Phase des rekursiven Aufstiegs (Rückgabe und
Zusammenbau der Ergebnisse)
34Fibonacci (Bildungsgesetz?)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
35Fibonacci (Bildungsgesetz?)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(...) ...................
fib(3) 2
36Fibonacci (Bildungsgesetz?)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(6) 5 3 8
fib(3) 2
fib(5) fib(4)
37Fibonacci (Startproblem!)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(6) 5 3 8
fib(3) 2
fib(5) fib(4)
Bildungsgesetz aktuelle Zahl ???
38Fibonacci (Startproblem!)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(6) 5 3 8
fib(3) 2
fib(5) fib(4)
Bildungsgesetz aktuelle Zahl letzte Zahl
vorletzte Zahl
39Fibonacci (Startproblem!)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(6) 5 3 8
fib(3) 2
fib(5) fib(4)
Bildungsgesetz aktuelle Zahl letzte Zahl
vorletzte Zahl Rekursive Formel
fib(n) fib( ... ) fib(
... )
40Fibonacci (Startproblem!)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(6) 5 3 8
fib(3) 2
fib(5) fib(4)
Rekursions-Schritt
Bildungsgesetz aktuelle Zahl letzte Zahl
vorletzte Zahl Rekursive Formel
fib(n) fib(n-1) fib(n-2)
41Fibonacci (Startproblem!)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(6) 5 3 8
fib(3) 2
fib(5) fib(4)
Rekursions-Schritt
Bildungsgesetz aktuelle Zahl letzte Zahl
vorletzte Zahl Rekursive Formel
fib(n) fib(n-1)
fib(n-2) Beachte Problemfall fib(1)
fib(...) fib(...) ???
42Fibonacci (Startproblem!)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(6) 5 3 8
fib(3) 2
fib(5) fib(4)
Rekursions-Schritt
Bildungsgesetz aktuelle Zahl letzte Zahl
vorletzte Zahl Rekursive Formel
fib(n) fib(n-1)
fib(n-2) Beachte Problemfall fib(1)
fib(0) fib(-1) ???
? Endlos-Rekursion? Undefiniert? Abhilfe?
43Fibonacci (rekursive Formel)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
fib(1) 1
fib(2) 1
fib(6) 5 3 8
fib(3) 2
fib(5) fib(4)
Rekursions-Schritt
Bildungsgesetz aktuelle Zahl letzte Zahl
vorletzte Zahl Rekursive Formel
fib(n) fib(n-1)
fib(n-2) Ausnahme für n lt 3 ist fib(n)
1
Rekursions-Start bzw. -Ende
44Fibonacci (Funktions-Aufbau)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
Rekursive Formel fib(n)
fib(n-1) fib(n-2) Ausnahme für n lt 3
ist fib(n) 1
Aufgabe Programmiere eine Funktion namens fib,
die zur Eingabe n die zugehörige
Fibonacci-Zahl liefert!
Eingabe-parameter
Typ des Rückgabewerts
Aufbau der Funktion
Funktions-Name
function fib(n integer) integerbegin ...
fib ... ... end
Zuweisung des Rückgabewertsan den Funktionsnamen
45Fibonacci (Programmierung)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
Rekursive Formel fib(n)
fib(n-1) fib(n-2) Ausnahme für n lt 3
ist fib(n) 1
Aufgabe Programmiere eine Funktion namens fib,
die zur Eingabe n die zugehörige
Fibonacci-Zahl liefert!
Rekursions-Bedingung
function fib(n integer) integerbegin if
..... then ......... else .........end
Rekursions-Schritt
Rekursions-Anfang bzw. -Ende
46Fibonacci (Programmierung)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
Rekursive Formel fib(n)
fib(n-1) fib(n-2) Ausnahme für n lt 3
ist fib(n) 1
Aufgabe Programmiere eine Funktion namens fib,
die zur Eingabe n die zugehörige
Fibonacci-Zahl liefert!
Rekursions-Bedingung
function fib(n integer) integerbegin if
..... then fib fib(n-1) fib(n-2) else
.........end
Rekursions-Schritt
Rekursions-Anfang bzw. -Ende
Rekursions-Schritt
rekursive Aufrufe
47Fibonacci (Programmierung)
- Beispiel 3 Die Fibonacci-Folge beginnt mit
den Zahlen
1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
Rekursive Formel fib(n)
fib(n-1) fib(n-2) Ausnahme für n lt 3
ist fib(n) 1
Aufgabe Programmiere eine Funktion namens fib,
die zur Eingabe n die zugehörige
Fibonacci-Zahl liefert!
Rekursions-Bedingung
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
Rekursions-Schritt
Rekursions-Anfang bzw. -Ende
Rekursions-Schritt
rekursive Aufrufe
48Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
........???........
49Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
fib(4) fib(3)
.................
50Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
fib(4) fib(3)
fib(3)fib(2)
.................
51Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
fib(4) fib(3)
fib(3)fib(2)
fib(2)fib(1)
...... ......
52Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
fib(4) fib(3)
fib(3)fib(2)
fib(2)fib(1)
1 ......
53Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
fib(4) fib(3)
fib(3)fib(2)
2
fib(2)fib(1)
1 1
54Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
fib(4) fib(3)
3
fib(3)fib(2)
2
fib(2)fib(1)
1
1 1
55Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
fib(4) fib(3)
2
3
fib(3)fib(2)
fib(2)fib(1)
2
fib(2)fib(1)
1
1 1
1 1
56Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
5
fib(4) fib(3)
2
3
fib(3)fib(2)
fib(2)fib(1)
2
fib(2)fib(1)
1
1 1
1 1
57Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
5
................
fib(4) fib(3)
2
3
fib(3)fib(2)
fib(2)fib(1)
2
fib(2)fib(1)
1
1 1
1 1
58Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
5
3
Beachte Aufrufstruktur? Verzweigungsfaktor?
Komplexität?
fib(3) fib(2)
fib(4) fib(3)
2
2
3
fib(3)fib(2)
fib(2)fib(1)
fib(2)fib(1)
1
2
fib(2)fib(1)
1
1 1 1 1
1 1
59Fibonacci (Aufrufstruktur)
- Aufruf der Fibonacci-Funktion
-
function fib(n integer) integerbegin if n gt
2 then fib fib(n-1) fib(n-2) else
fib 1end
a fib(6)
fib(5) fib(4)
5
3
Beachte Durch den zweifachen rekursiven
Aufrufvon fib entsteht eine (unvollständige)
Baumstruktur mit2-facher Verzweigung! Eine
Vergrößerung von n bedeutet daher fast doppelten
Aufwand,d.h. die Komplexität liegt bei etwa
2n. (asymptotisch 1,618n)
fib(3) fib(2)
fib(4) fib(3)
2
2
3
fib(3)fib(2)
fib(2)fib(1)
fib(2)fib(1)
1
2
fib(2)fib(1)
1
1 1 1 1
1 1
60Aufgaben (numerisch)
- Aufgaben Entwickeln und testen Sie Funktionen
- fak zur rekursiven Berechnung der Fakultät einer
Zahl - summe_1_bis_n zur Berechnung von 123...n
(Tipp Kopieren und ändern Sie fak
entsprechend!) - fib zur rekursiven Berechnung der Fibonaccizahl
- Bauen Sie bei fib einen Aufrufzähler (globale
Variable! warum?) ein, der bei jedem Aufruf von
fib inkrementiert wird! - Zum Vergleich Programmieren Sie fakiter und
fibiter zur iterativen Berechnung von fak und
fib, d.h. mit Schleifen anstatt Rekursion!
61Aufgabe Binomialkoeffizienten
- Eine Funktion mit zwei Eingabewerten
- bin(n,k) dient zur Berechnung von
Binomialkoeffizienten ( )anhand des Pascalschen
Dreiecks
n
k
???
???
62Aufgabe Binomialkoeffizienten
- Eine Funktion mit zwei Eingabewerten
- bin(n,k) dient zur Berechnung von
Binomialkoeffizienten ( )anhand des Pascalschen
Dreiecks
n
k
63Aufgabe Permutationen
- Buchstabenrätsel ZUES ???Eine Prozedur soll
systematisch alle Permutationen erzeugen! - Strategie perm(ZUES)
Z perm(UES)
S perm(ZUE)
E perm(ZUS)
U perm(ZES)
. . .
. . .
. . .
ZU perm(ES)
ZS perm(UE)
ZE perm(US)
ZUE perm(S)
ZUS perm(E)
ZEU perm(S)
ZES perm(U)
ZSU perm(E)
ZSE perm(U)
ZUES
ZUSE
ZEUS
ZESU
ZSUE
ZSEU
Tipp Verwenden Sie zwei Parameter
perm(kopf,rest string) und den
Startaufruf perm( , ZUES). restlicher
Teil bereits permutierter Teil
64Aufgabe Ackermann-Funktion
- Ein Beispiel für verschachtelte Rekursion
- Die Ackermann-Funktion hat 2 Eingabewerte x und
y,und wächst extrem schnell! - y1 , falls x 0
- a(x,y) a(x-1,1) , falls x ? 0 und y 0
- a(x-1, a(x, y-1)) , sonst
- Berechne per Hand a(1,1) und a(2, 2) .
- Programmiere und teste a !
- (Für theoretische Informatiker Die
Ackermann-Funktion ist zwar berechenbar, aber
nicht primitiv-rekursiv... )
65Aufgabe universelle Funktion
- Die universelle Funktion f (x, y, a) kann
verschiedene Funktionen berechnen. - x und y sind die beiden Eingabewerte, und mit a
bestimmt man - a 1 Addieren a 2 Multiplizieren a
3 Potenzieren a gt 3 ??? - x y , falls a 1
- f (x,y,a) x , falls a ? 1 und y 1
- f (x, f (x, y-1, a), a-1) , sonstBerechne
per Hand f(4, 3, 2) und f( 2, 3, 3) . - Programmiere und teste f !
66Aufgabe Türme von Hanoi
- Bei den Türmen von Hanoi muss ein Stapel von
goldenen Scheiben von einem Startplatz auf einen
Zielplatz bewegt werden.Zum Manövrieren gibt es
noch einen Ablageplatz, denn es darf niemals eine
größere auf eine kleinere Scheibe gelegt werden. - Suchen Sie zunächst das rekursive Prinzip, um
das ProblemBewege einen Turm der Höhe n auf
ein kleineres Problem zu reduzieren! - Entwickeln Sie dann eine rekursive Prozedur
- hanoi(hoehe, von, nach integer) ,
- die eine Ausgabe wie z.B. nebenstehend erzeugt!
- (Ein praktischer Trick 123 6, d.h. die
Formel für eine Platznummer lautet immer 6
die beiden anderen Platznummern . Hilft das ?!)
Start (1)
Ablage (2)
Ziel (3)
67Sammlung rekursiver Probleme
- Eine kleine Sammlung rekursiv lösbarer
ProblemeNumerisch Fakultät, Summe-1-bis-n,
Potenz, Fibonacci, Binomialkoeffizienten
(Pascalsches Dreieck), universelle Funktion,
Ackermann - Graphisch Spirale, Busch, Baum, Kochkurve
(Schneeflocke), Hutschnur, Drachenkurve
(Papierfaltung), Sierpinski-Dreieck/-Quadrat,
Peano-Kurve, Cantor-Staub (zerstückelte
Strecke) - Textuell Spiegelung, Permutationen
(Buchstabenrätsel), Formale Sprache (Erzeugung
anhand Grammatik) - Spiel Zahlenraten, Türme von Hanoi
- Backtracking Labyrinth, Acht-Damen- /
Springer-Problem, Solitaire (Nimm-Spiel),
Spielstrategien - Suchen und Sortieren binäre Suche, Quicksort,
Mergesort
68Methodische Zugänge
- Problemanalyse Zerlegung in ähnliche
Teilaufgaben - Code-orientiert a) Was tut dieses Programm?
- b) Code mit Auskunftsfunktion bei jedem
Aufruf wird dieser inkl. aktueller
Parameter ausgegeben - c) Einbau eines Aufruf-Zählers (globale
Variable) - Gegenständlich verschachtelte Kartons oder
Matrioschkas (im Innern liegt ein Schatz
nacheinander alle öffnen und danach alle
wieder schließen), Papierstreifen falten
(Faltrichtung beachten!) - Rollenspiel Für jeden Aufruf kommt ein weiterer
Spieler auf die Bühne, der seine Arbeit
demonstriert und ggf. weitere Spieler aufruft.
Evtl. Tafelprotokoll. Hilfe Vorbereitete
Aufruf-/Aufgabenzettel. - Visualisierungen a) Aufrufstruktur mit
rekursivem Ab- und Aufstieg - b) Entwicklung des Aufruf-Stapels (stacks)
Aufbau und Abbau (dynamisches Tafelbild)
69Rekursion versus Iteration Bsp. Fakultät
rekursiv iterativ
function fak(n integer) integervar f, i
integerbegin f 1 for i 2 to n
do f f ? i fak fend
function fak(n integer) integerbegin if n
gt 1 then fak n ? fak(n-1) else
fak 1end
Benötigt werden hier zwei Variablen i als
Laufvariable für die Schleife, und f als
Variable für das Zwischenergebnis,da die
Funktionsvariable faknur auf der linken Seite
einer Zuweisung benutzt werden darf!(rechts
rekursiver Aufruf!!)
Benötigt wird intern ein Stack,um die
unfertigen Aufrufezu speichern.
70Vor- und Nachteile von Rekursion
- Rekursion pro und contra
- mächtige Methode der Problemzerlegung
- elegante deklarative Formulierung der Lösung
- flexibel bezüglich der Problemgröße
- (keine festgelegten Schleifenanzahlen, z.B. bei
Permutationen, n-Damen) - nicht sofort zu durchschauen
- evtl. unnötig hoher Zeitbedarf
- (exponentielle Komplexität bei
Mehrfachrekursion)(wiederholtes Berechnen von
Zwischenergebnissen, z.B. bei fib )(interner
Verwaltungsaufwand Stack mit begrenzter Größe)
71Literaturverzeichnis und Links
- Quicksort Baumann Informatik für die
Sekundarstufe II, Band 2 - MUI-Sprache (MU-Problem) Hofstadter Gödel,
Escher, Bach (dtv 1991) - Rekursion ETH http//www.ite.ethz.ch/education/i
d1/vortraege/rekursion.pdf - Downloads (Word, PDF) zu "Rekursives
Programmieren" http//educeth.ethz.ch/informatik/
leitprog/rekursion - Backtracking anschaulich http//educeth.ethz.ch/i
nformatik/vortraege/backtracking - Über Fragen, Hinweise, Korrekturen würde ich mich
freuen - tobias.selinger_at_gmx.de