Rekursion - PowerPoint PPT Presentation

About This Presentation
Title:

Rekursion

Description:

Title: Strukturierte Programmierung Author: Tobias Selinger Last modified by: TS Created Date: 8/12/2001 2:57:28 PM Document presentation format: Bildschirmpr sentation – PowerPoint PPT presentation

Number of Views:170
Avg rating:3.0/5.0
Slides: 72
Provided by: Tobi75
Category:

less

Transcript and Presenter's Notes

Title: Rekursion


1
Rekursion
  • IFB Weiterbildungslehrgang X Informatik
  • Kurs 2 Thema Rekursion
  • 2. 12. 2005
  • Tobias Selinger

2
Einleitung
  • Was macht man mit einem großen Problem?

Flugzeugsimulator-Programm
?
3
Modularisierung - 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
4
Zerlegung in Teilprobleme?
4 ! 4 3 2 1 24 5 !
5 4 3 2 1 120
5
Definition 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 ?

6
Busch 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
7
Busch 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
8
Busch 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 ???
9
Busch 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???
10
Busch 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...
11
Busch 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
??? ??? ???
12
Busch 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!)
13
Busch 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
14
Busch 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
15
Busch 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!
16
Busch Aufbau der Levels
Level 1
17
Busch Aufbau der Levels
Level 2
18
Busch Aufbau der Levels
Level 3
19
Busch 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!)

23
Numerischer 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 ! ?
24
Fakultä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 ! ???
25
Fakultä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 ! ?
26
Fakultä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!
27
Fakultä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)
28
Fakultä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)
29
Fakultä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)
30
Fakultä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
31
Fakultä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
32
Fakultä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
33
Fakultä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)
34
Fibonacci (Bildungsgesetz?)
  • Beispiel 3 Die Fibonacci-Folge beginnt mit
    den Zahlen

1. 2. 3. 4. 5. 6. 7. 8.
1 1 2 3 5 ... ... ...
35
Fibonacci (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
36
Fibonacci (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)
37
Fibonacci (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 ???
38
Fibonacci (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
39
Fibonacci (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(
... )
40
Fibonacci (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)
41
Fibonacci (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(...) ???
42
Fibonacci (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?
43
Fibonacci (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
44
Fibonacci (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
45
Fibonacci (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
46
Fibonacci (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
47
Fibonacci (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
48
Fibonacci (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)
........???........
49
Fibonacci (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)
.................
50
Fibonacci (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)
.................
51
Fibonacci (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)
...... ......
52
Fibonacci (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 ......
53
Fibonacci (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
54
Fibonacci (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
55
Fibonacci (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
56
Fibonacci (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
57
Fibonacci (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
58
Fibonacci (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
59
Fibonacci (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
60
Aufgaben (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!

61
Aufgabe Binomialkoeffizienten
  • Eine Funktion mit zwei Eingabewerten
  • bin(n,k) dient zur Berechnung von
    Binomialkoeffizienten ( )anhand des Pascalschen
    Dreiecks

n
k
???
???

62
Aufgabe Binomialkoeffizienten
  • Eine Funktion mit zwei Eingabewerten
  • bin(n,k) dient zur Berechnung von
    Binomialkoeffizienten ( )anhand des Pascalschen
    Dreiecks

n
k
63
Aufgabe 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
64
Aufgabe 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... )

65
Aufgabe 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 !

66
Aufgabe 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)
67
Sammlung 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

68
Methodische 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)

69
Rekursion 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.
70
Vor- 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)

71
Literaturverzeichnis 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
Write a Comment
User Comments (0)
About PowerShow.com