Rekursion und Iteration -

Werbung
Rekursion im Informatikunterricht
von Michael Fothe
1 Einführung
S. SCHUBERT und A. SCHWILL kennzeichnen in ihrem Buch (2004) Rekursion als
eine fundamentale Idee der Informatik. Der Autor des hier vorliegenden Beitrags ist
ebenfalls der Auffassung, dass das Thema in einen zeitgemäßen Informatikunterricht
an allgemeinbildenden Schulen gehört. Rekursion spielt in Theorie und Praxis der
Informatik eine wesentliche Rolle (beispielsweise bei Sprachdefinitionen von Pro­
grammiersprachen, bei Algorithmen zur Verarbeitung von Listen und Syntaxanalyse
mittels rekursiven Abstiegs), und es gehört zu den Aufgaben von Schule, frühzeitig
solche Themen aufzugreifen und die Schülerinnen und Schüler frühzeitig in wichtige
Denk- und Arbeitsweisen der Wissenschaften einzuführen.
In der fachdidaktischen Literatur der letzten zehn Jahre wird das Thema „Rekursion
und Iteration“ unterschiedlich gewichtet. WAGENKNECHT befasst sich unter Anwen­
dung der Programmiersprache SCHEME detailliert mit dem Thema (vgl. Wagen­
knecht, 1994). BAUMANN setzt sich mit den Möglichkeiten der Rekursion auseinan­
der (vgl. Baumann, 1996). Doch es gibt auch Gegenstimmen: RECHENBERG
betrachtet die Rekursion, weil zu speziell, als in der Schulinformatik eher verzichtbar
(vgl. Rechenberg, 1997), und HUBWIESER geht auf sie nicht näher ein (vgl. Hub­
wieser, 2000).
Das Ziel des vorliegenden Beitrags ist eine Positionsbestimmung innerhalb dieser
Bandbreite. Dabei geht es um Zugänge zur Rekursion und um Beispiele, die aus
didaktisch-methodischer Sicht kommentiert werden. Rekursion wird nicht als etwas
Natürliches dargestellt. Nur wenige Beispiele für Endrekursion werden angegeben.
Baumstrukturen und die Äquivalenz von Iteration und Rekursion werden thematisiert.
In diesen Punkten besteht Übereinstimmung mit RECHENBERG.
2 Zugänge zur Rekursion
Im Folgenden werden sechs Zugänge zur Rekursion skizziert. Mit diesen Zugängen
kann Rekursion im Informatikunterricht in unterschiedlicher Weise ohne Computer­
einsatz thematisiert werden. Das geschieht mit dem Ziel, ein inhaltliches Verständnis
von Rekursion zu erreichen.
2.1 Zugang über Sprachdefinitionen
Der Aufbau von Zeichenfolgen wird häufig unter Verwendung von Rekursion
beschrieben. Damit wird eine kompakte Beschreibung erreicht. Die Schülerinnen und
Schüler sollen in der Lage sein, syntaktisch korrekte Zeichenfolgen zu bilden und die
syntaktische Korrektheit einer gegebenen Zeichenfolge zu überprüfen.
Ein Beispiel ist die syntaktische Definition von „Anweisung“ in der Programmier­
sprache Java, die nachfolgend auszugsweise angegeben ist. Die Definition erfolgt
mithilfe der EBNF.
Anweisung = … ( …
| “if“ “(“ Ausdruck “)“ Anweisung [ “else“ Anweisung ]
| “while“ “(“ Ausdruck “)“ Anweisung
| “return“ [ Ausdruck ] “;“
| … ).
1
Das zu definierende Nichtterminalsymbol Anweisung ist mehrfach auf der rechten
Seite der Definition angegeben, d. h. bei der Definition von Anweisung wird Anwei­
sung verwendet.
Ein anderes Beispiel ist die Syntax der Ausdrücke in der Programmiersprache
Oberon-2:
Relation = “=“ | “#“ | “< “ | “<= “ | “>“ | “>=“ | “IN“ | “IS“.
AddOperator = “+“ | “-“ | “OR“.
MulOperator = “*“ | “/“ | “DIV“ | “MOD“ | “&“.
Ausdruck = EinfacherAusdruck [ Relation EinfacherAusdruck ].
EinfacherAusdruck = [ “+“ | “-“ ] Term { AddOperator Term }.
Term = Faktor { MulOperator Faktor }.
Faktor = Zahl | ZeichenKonstante | Zeichenkette | NIL | Menge |
Bezeichner [ AktuelleParameter ] | “(“ Ausdruck “)“ | “~“ Faktor.
Der syntaktische Aufbau eines Ausdrucks wird durch ein System von
Nichtterminalsymbolen rekursiv beschrieben (Ausdruck, EinfacherAusdruck, Term
und Faktor). Ein Faktor kann z. B. eine Zahl, ein Variablenbezeichner oder – und
damit wird die Rekursion deutlich – wieder ein Ausdruck (eingeschlossen in runde
Klammern) sein. Nach der Beschreibung stellen z. B. die Zeichenfolgen 2*a+b=c,
1.0-(x-1.0)/(y-1.0) und a+b*(c+d*(e+f*(g+h*i))) syntaktisch korrekte Ausdrücke dar.
Ein weiteres Beispiel ist die „Sprache der Bäume“, bei der mithilfe von grafischen
Terminal- und Nichtterminalsymbolen definiert wird, was unter einem binären Baum
verstanden wird (vgl. Nievergelt/Hinrichs, 1993).
2.2 Zugang über mathematische Kurven
Ein Beispiel sind die rekursiven Hilbert-Kurven (siehe Bild 1).
H1
H2
H3
Bild 1: Die Hilbert-Kurven der Ordnung 1, 2 und 3
Im Unterricht können die Hilbert-Kurven H1, H2 und H3 vorgegeben werden.
Ausgehend von der elementaren Hilbert-Kurve H1 werden die Konstruktion von H2
aus H1 und von H3 aus H2 nachvollzogen. Die Schülerinnen und Schüler erkennen,
2
dass jeweils vier Hilbert-Kurven Hk zur Hilbert-Kurve Hk+1 zusammengesetzt werden.
Die vier Hilbert-Kurven werden in die jeweils gleiche Position zueinander gebracht
und mit Verbindungsstrecken, die in den Abbildungen aus Verständnisgründen her­
vorgehoben sind, verbunden.
Im Unterricht kann auch nur die Hilbert-Kurve H3 vorgegeben werden. Dann wird
analysiert, dass die Hilbert-Kurve H3 aus vier Hilbert-Kurven H2 und dass die HilbertKurve H2 aus vier Hilbert-Kurven H1 besteht. Allgemein wird deutlich, dass eine
Hilbert-Kurve Hk aus vier Hilbert-Kurven Hk-1 aufgebaut ist. Dieser Weg bereitet das
Programm von Abschnitt 3.9 vor (vgl. Abschnitt 3.9).
Weitere mathematische Kurven, die im Unterricht diskutiert werden können, sind z.
B. die Sierpinski-Kurven, die Schneeflockenkurven und der Baum des Pythagoras
(vgl. Heyderhoff, 1990).
2.3 Zugang über Bilder
Das „Bild im Bild“ beim Fernsehen verdeutlicht Wiederholung mit Rekursion. Die
Zeichnung von M. C. Escher „Zeichnende Hände“ (1948) symbolisiert indirekte
Rekursion, bei der sich zwei Unterprogramme wechselseitig aufrufen, wobei es keine
Abbruch gibt. Matroschkas sind eine schöne Illustration von Rekursion.
2.4 Zugang über Begriffsdefinitionen
Die Definition wichtiger informatischer Begriffe erfolgt auf rekursive Art. Ein erstes
Beispiel ist der Begriff Liste (vgl. z. B. Fothe, 2002). Ein zweites Beispiel ist die Defi­
nition eines binären Baumes:
Ein binärer Baum besteht aus einem Element (der Wurzel) und zwei binären
Bäumen (dem linken und dem rechten Teilbaum), oder es ist der leere binäre
Baum. Ein binärer Baum besteht aus endlich vielen Elementen.
Die Schülerinnen und Schüler sollen sich mit der Definition aktiv auseinander setzen.
Eine mögliche Aufgabe ist das Begründen, dass eine bestimmte Zeichnung einen
binären Baum darstellt (siehe Bild 2). Dabei wäre herauszuarbeiten, dass jeder Kno­
ten, so z. B. auch E und F, zwei Teilbäume besitzt. Bei E sind beide Teilbäume leer,
bei F ist nur der linke Teilbaum leer. Die Schülerinnen und Schüler sollen korrekte
binäre Bäume angeben können.
a
b
B
d
c
C
e
E
f
g
h
3
Bild 2: Beispiel für einen binären Baum
Ein drittes Beispiel ist die Definition von „Turm“, die im Abschnitt 3.4 genutzt wird: Ein
Turm besteht aus der größten Scheibe und dem Rest-Turm oder es ist der leere
Turm (siehe Bild 3).
Turm der Höhe 5:
Die größte Scheibe und Turm der Höhe 4:
Bild 3: Ein Turm wird in seine größte Scheibe und den Rest-Turm zerlegt. Diese
Idee wird bei den „Türmen von Hanoi“ angewandt.
Das Definieren der Begriffe „Liste“, „binärer Baum“ und „Turm“ auf rekursive Art
(auch eine Form des Modellierens) geht dem Erarbeiten rekursiver Programme
voraus.
2.5 Zugang über Texte
In natürlichen Sprachen lassen sich Strukturen finden, mit denen sich Vor-Erfahrun­
gen zur Rekursion gewinnen lassen. Der Satz „Dass dieser Wurm an Würmern litt,
die wiederum an Würmern litten…“ (Joachim Ringelnatz) und die Ankündigung „Ich
pflege jedem Sonntagskind, das sich zu mir zu finden weiß, drei Wünsche zu gewäh­
ren. Die ersten zwei sind frei, den dritten kann ich verweigern, wenn er töricht ist.“
(Wilhelm Hauff: Das kalte Herz) illustrieren einen Spezialfall der Rekursion, die
Endrekursion, sofern der dritte Wunsch wieder drei Wünsche sind.
Ein weiteres Beispiel sind Schachtelsätze, wie ein Eintrag in einem Lokalanzeiger:
Derjenige der den Täter der den Pfahl der an der Brücke die an dem Weg der nach Jena
führt liegt steht umgeworfen hat anzeigt erhält eine Belohnung.
Die Strukturierung kann mit Kommas erfolgen:
Derjenige, der den Täter, der den Pfahl, der an der Brücke, die an dem Weg, der nach Jena
führt, liegt, steht, umgeworfen hat, anzeigt, erhält eine Belohnung.
Möglich ist auch eine Strukturierung durch Ebenen:
Derjenige
erhält eine Belohnung.
der den Täter
anzeigt
der den Pfahl
umgeworfen hat
der an der Brücke
steht
die an dem Weg
liegt
der nach Jena führt
4
Auf jeder Ebene, bis auf die unterste, wird der Textfluss unterbrochen und später
fortgesetzt. Das Beispiel hat jedoch Grenzen, da auf den Ebenen vollkommen
andere Texte stehen.
2.6 Zugang über Handlungsabläufe
Mit dem folgenden Beispiel wird an die zweite Strukturierung des Schachtelsatzes
aus Abschnitt 2.5 angeknüpft.
Es klingelt. Ich lasse Anna herein 
und sage Anna guten Tag.
Es klingelt. Ich lasse Bert herein 
und sage Bert guten Tag. 
Es klingelt. Ich lasse Clara herein 
und sage Clara guten Tag. 
Es klingelt. Ich lasse Dirk herein und sage Dirk guten Tag. 
Bevor ich Anna, Bert und Clara begrüßen kann, klingelt es wieder. Meine Tätigkeit
wird von einer gleichartigen Tätigkeit unterbrochen. Ich begrüße erst Dirk, dann
Clara, Bert und Anna (vgl. Thüringer Abiturprüfung Grundfach Informatik 2001, Auf­
gabe 1.1).
Ein rekursiver Algorithmus soll alle Anordnungen (Permutationen) von gegebenen
Elementen ermitteln. Der Algorithmus wird nachfolgend an den Elementen A, B, C
und D erläutert.
Mithilfe von Tauschoperationen werden die folgenden Viererfolgen erzeugt:
ABCD
ABDC
ADCB
DBCA
Jedes der vier Elemente steht einmal an der vierten Position. Nach dem Erzeugen
einer jeden Viererfolge werden mithilfe von Tauschoperationen Dreierfolgen erzeugt.
Das Element an der vierten Position bleibt dabei fest. Zum Beispiel werden aus der
zweiten Viererfolge die folgenden Dreierfolgen erzeugt:
ABDC
ADBC
DBAC
Jedes der drei Elemente steht einmal an der dritten Position. Nach dem Erzeugen
einer jeden Dreierfolge werden mithilfe von Tauschoperationen Zweierfolgen erzeugt.
Die Elemente an der dritten und vierten Position bleiben dabei fest. Zum Beispiel
werden aus der dritten Dreierfolge die folgenden Zweierfolgen erzeugt:
DBAC
BDAC
Jedes der beiden Elemente steht einmal an der zweiten Position.
Das beschriebene Handlungsmuster ist unabhängig von der Anzahl an Elementen
einer Folge. Mit dem rekursiven Vorgehen werden die 24 Permutationen für die
gegebenen vier Elemente ermittelt.
5
2.7 Vergleichen von Rekursion und Iteration
Rekursion und Iteration können auf hohem Abstraktionsniveau verglichen werden.
Beides sind Formen von Wiederholung. Rekursion kann als Wiederholung struktur­
gleicher Blöcke durch Schachtelung, Iteration als Wiederholung strukturgleicher Blö­
cke durch Aneinanderreihung gekennzeichnet werden (siehe Bild 4).
Bild 4: Schematische Darstellung von Iteration und Rekursion
3 Rekursive Problemlösungen mit dem Computer
In diesem Abschnitt sind exemplarisch zehn Probleme aufbereitet, die unterschied­
lichen Schwierigkeitsgrad besitzen und an denen Grundlagen der Realisierung von
Rekursion mittels Computerprogrammen vermittelt werden können. Rekursive Pro­
gramme zur Berechnung von Gliedern der FIBONACCI-Zahlenfolge und anderer
rekursiv definierter Zahlenfolgen sowie von Funktionswerten der Fakultätsfunktion
fehlen nachfolgend, da diese Berechnungen aus Effizienzgründen iterativ oder mit
einer Tabelle erfolgen sollten (vgl. Winkler/Nievergelt, 1989). Als Programmierspra­
chen werden OBERON-2 und PYTHON verwendet. Zu rekursiv arbeitenden
PROLOG-Programmen wird auf die Literatur verwiesen (vgl. Clocksin/Mellish, 1990).
3.1 Überführen von Dezimal- in Dualzahlen
Die Schülerinnen und Schüler wissen, dass Computer intern im Dualsystem arbeiten.
Eine Konsequenz davon ist, dass eine Dezimalzahl, die vom Computer eingelesen
wird, vor der Verarbeitung in die gleichwertige Dualzahl zu überführen ist. Das fol­
gende Python-Programm löst diese Aufgabe:
def dual(zahl) :
ganz = zahl / 2
# Division ohne Rest
rest = zahl % 2
# Rest der Division
if rest == 0 :
# Test auf Gleichheit
zeichen = '0'
else :
zeichen = '1'
if ganz == 0 :
return zeichen
else :
return dual(ganz) + zeichen
n = input('ganze Zahl:')
print dual(n)
6
Im Unterricht kann an dem Beispiel erläutert werden, wie rekursive Programme vom
Computer abgearbeitet werden. In der vorletzten Zeile wird der Wert der ganzzahli­
gen Variablen n eingelesen (z. B. 113) und in der letzten Zeile wird mit dual(n) die
Funktion dual das erste Mal aufgerufen. Der Wert 113 wird an den Wertparameter
zahl der Funktion dual übergeben und es werden die Werte der lokalen Variablen
berechnet: ganz=56, rest=1 und zeichen='1'. Mit dual(56) ruft sich die Funktion dual
rekursiv auf. Wir nennen dies rekursiven Abstieg. Weitere Selbstaufrufe sind
dual(28), dual(14), dual(7), dual(3) und dual(1). Bei der Abarbeitung von dual(1) wer­
den die Werte ganz=0, rest=1 und zeichen='1' ermittelt. Mit ganz=0 ist der rekursive
Abbruch (also der Basisfall) erreicht und die Funktion dual liefert das Zeichen '1' als
Funktionswert. An dieses Zeichen werden beim rekursiven Aufstieg nacheinander die
Zeichen '1', '1', '0', '0', '0' und '1' angehangen. Als Ergebnis entsteht die Zeichenkette
'1110001'. Jedes Mal, wenn die Funktion dual zur Abarbeitung gebracht wird, werden
die lokalen Variablen ganz, rest und zeichen erzeugt. Rekursion wird bei dieser
Problemlösung eingesetzt, um alle Divisionsreste zu berechnen und diese in umge­
kehrter Reihenfolge auszugeben. An dem Programm wird deutlich, dass Rekursion
durch einen Selbstaufruf von Unterprogrammen gekennzeichnet ist.
3.2 Größter gemeinsamer Teiler
Taschenrechner, die mit gemeinen Brüchen operieren, können Ergebnisse kürzen,
indem sie ein Unterprogramm, das den Algorithmus nach EUKLID ausführt, zur
Abarbeitung bringen. Die Berechnung des ggT der ganzen Zahlen x und y kann
iterativ mit einer Schleife erfolgen (Python-Programm):
def ggT1(x, y) :
while y > 0 :
rest = x % y
x=y
y = rest
return x
a = 12
b = 40
g = ggT1(a, b)
print g
Die ggT-Berechnung lässt sich auch rekursiv formulieren:
def ggT2(x, y) :
if y == 0 :
return x
else :
return ggT2(y, x % y)
An diesem Beispiel erkennen die Schülerinnen und Schüler, wie eine iterative in
eine rekursive Problemlösung umgesetzt wird. Es entsteht Endrekursion, bei der
beim rekursiven Aufstieg keine Operationen mehr auszuführen sind.
3.3 Permutationen
Der Handlungsablauf von Abschnitt 2.6 kann z. B. in ein Programm in Oberon-2
umgesetzt werden. Entscheidend ist die Prozedur Perm. Bei vier Elementen ist
Perm(3) der erste Aufruf dieser Prozedur. Der rekursive Abbruch (der Basisfall) liegt
vor, wenn eine Folge nur aus einem Element besteht.
7
PROCEDURE Perm(n: INTEGER);
VAR k: INTEGER;
BEGIN
IF n = 0 THEN LoesungAusgeben ELSE
FOR k := n TO 0 BY -1 DO
Tausch(a[k], a[n]);
Perm(n - 1);
(* rekursiver Aufruf *)
Tausch(a[k], a[n])
END
END
END Perm;
Das Programm kann im Informatikunterricht beim Lösen von verschiedenen
Problemen genutzt werden. Ein Beispiel ist das Problem des Handlungsreisenden,
bei dem eine kürzeste Rundreise durch n Städte gesucht wird. Die Permutation 1 4 3
2 beschreibt die folgende Rundreise: Beginnend in der Stadt 1 geht es nacheinander
in die Städte 4, 3 und 2 und dann wieder zur Ausgangsstadt 1. Zur Lösung sind drei
Teile zu erarbeiten: Ermitteln aller Permutationen, Ermitteln der Länge einer jeden
Rundreise, Heraussuchen einer kürzesten Rundreise (vgl. Thüringer Abiturprüfung
Leistungsfach Informatik 2001, Aufgabe 3.2). Diese Methode des systematischen
Durchprobierens aller Varianten ist nur für wenige Städte anwendbar, da die
Rechenzeit exponentiell mit der Problemgröße, der Anzahl an Städten, ansteigt.
3.4 Türme von Hanoi
Bei dem bekannten Spiel „Türme von Hanoi“ sind Scheiben von einem Feld auf ein
anderes in möglichst wenigen Schritten zu versetzen. Auf einem dritten Feld können
Scheiben zwischengelagert werden. Beim Versetzen sind zwei Spielregeln zu
beachten: Versetze immer nur eine Scheibe von einem Feld auf ein anderes und
lege stets eine kleinere Scheibe auf eine größere (vgl. auch 43. MathematikOlympiade, 1. Stufe, Klasse 6, Aufgabe 430612).
Bei der rekursiven Lösung wird der Begriff „Turm“ verwendet (vgl. Abschnitt 2.4). Das
Versetzen eines Turmes, der aus k Scheiben besteht, wird auf das zweimalige
Versetzen eines Turms, der aus k-1 Scheiben besteht, zurückgeführt. Der rekursive
Abbruch (Basisfall) liegt vor, wenn der leere Turm zu versetzen ist. Nach dieser
Vorschrift sind ganze Türme zu versetzen, obwohl nach den Spielregeln nur einzelne
Scheiben bewegt werden dürfen. Die Schülerinnen und Schüler sollen erkennen,
dass dieser Widerspruch durch wiederholtes Anwenden der Vorschrift aufgelöst wird.
Bild 5 illustriert dies für einen Turm, der aus vier Scheiben besteht. Die rechte Spalte
ist die Einzige, die ausschließlich direkt ausführbare Handlungen enthält. Die n
Scheiben bekommen der Größe nach die Nummern von 1 bis n. Die kleinste Scheibe
trägt die Nummer 1. Turm(k, a, b) bedeutet: Versetze den Turm, der aus k Scheiben
besteht, von Feld a nach Feld b. Scheibe(k, a, b) bedeutet: Versetze Scheibe k von
Feld a nach Feld b.
8
Turm(1, 1, 3)
Turm(2, 1, 2)
Scheibe(2, 1, 2)
Turm(1, 3, 2)
Turm(3, 1, 3)
Scheibe(3, 1, 3)
Scheibe(3, 1, 3)
Turm(1, 2, 1)
Turm(2, 2, 3)
Scheibe(2, 2, 3)
Turm(1, 1, 3)
Turm(4, 1, 2)
Scheibe(4, 1, 2)
Scheibe(4, 1, 2)
Scheibe(4, 1, 2)
Turm(1, 3, 2)
Turm(2, 3, 1)
Scheibe(2, 3, 1)
Turm(1, 2, 1)
Turm(3, 3, 2)
Scheibe(3, 3, 2)
Scheibe(3, 3, 2)
Turm(1, 1, 3)
Turm(2, 1, 2)
Scheibe(2, 1, 2)
Turm(1, 3, 2)
Turm(0, 1, 2)
Scheibe(1, 1, 3)
Turm(0, 2, 3)
Scheibe(2, 1, 2)
Turm(0, 3, 1)
Scheibe(1, 3, 2)
Turm(0, 1, 2)
Scheibe(3, 1, 3)
Turm(0, 2, 3)
Scheibe(1, 2, 1)
Turm(0, 3, 1)
Scheibe(2, 2, 3)
Turm(0, 1, 2)
Scheibe(1, 1, 3)
Turm(0, 2, 3)
Scheibe(4, 1, 2)
Turm(0, 3, 1)
Scheibe(1, 3, 2)
Turm(0, 1, 2)
Scheibe(2, 3, 1)
Turm(0, 2, 3)
Scheibe(1, 2, 1)
Turm(0, 3, 1)
Scheibe(3, 3, 2)
Turm(0, 1, 2)
Scheibe(1, 1, 3)
Turm(0, 2, 3)
Scheibe(2, 1, 2)
Turm(0, 3, 1)
Scheibe(1, 3, 2)
Turm(0, 1, 2)
Scheibe(1, 1, 3)
Scheibe(2, 1, 2)
Scheibe(1, 3, 2)
Scheibe(3, 1, 3)
Scheibe(1, 2, 1)
Scheibe(2, 2, 3)
Scheibe(1, 1, 3)
Scheibe(4, 1, 2)
Scheibe(1, 3, 2)
Scheibe(2, 3, 1)
Scheibe(1, 2, 1)
Scheibe(3, 3, 2)
Scheibe(1, 1, 3)
Scheibe(2, 1, 2)
Scheibe(1, 3, 2)
Bild 5: Umsetzen eines Turms der Höhe 4 von Feld 1 nach Feld 2
Die rekursive Vorschrift ist Ausgangspunkt für die Programmentwicklung (vgl. z. B.
Fothe/Kerner, 1988). Das entstehende Programm ist unerwartet kurz. Aus der rekur­
siven Lösung lassen sich iterative herleiten. Eine Variante ist das wechselweise
Anwenden der beiden folgenden Regeln: Lege die kleinste Scheibe eins weiter (ent­
weder stets rechts herum oder stets links herum). Lege eine andere Scheibe.
3.5 Quicksort
Der wichtige Sortieralgorithmus Quicksort besitzt eine rekursive Struktur. Beim
Abarbeiten von Sort(L, R) werden die Elemente der Folge von aL bis aR in die richtige
Reihenfolge gebracht. Die Prozedur Sort enthält zwei rekursive Aufrufe, und zwar für
die linke Teilfolge der Elemente von aL bis aK und die rechte Teilfolge der Elemente
von aI bis aR (Methode Teile und herrsche). Der rekursive Abbruch (Basisfall) liegt
vor, wenn eine Teilfolge nur aus einem Element besteht. Das Zeit- und Speicher­
verhalten von Quicksort kann im Unterricht auf der Grundlage eines einfachen
Modells thematisiert werden (vgl. Fothe, 2003). Beim Speicherverhalten sind der
Speicherplatz für die Elemente und die Einträge im Stack zu berücksichtigen. Im
besten Fall liegen gleichzeitig bis zu ld(n) Einträge im Stapelspeicher vor, im
schlechtesten Fall sind es n-1.
9
An dem Programm „Quicksort“ kann die interne Abarbeitung rekursiver Unterpro­
gramme auf der Ebene einer Modellvorstellung thematisiert werden. Mit einem
Stapelspeicher (Stack, Keller), der vom Laufzeitsystem der Programmiersprache
automatisch verwaltet wird, kann ein rekursiv arbeitendes Programm auf einem
iterativ arbeitenden Computer (Computer nach dem von-Neumann-Rechnermodell
arbeiten iterativ) zur Abarbeitung gebracht werden. Bei jedem rekursiven
Unterprogrammaufruf werden die Werte der Parameter und die der lokalen Variablen
sowie die Rückkehradresse im Stapelspeicher gespeichert und später wieder vom
Stapelspeicher geholt.
3.6 Suchbaum
Auf rekursive Datenstrukturen kann auf rekursive Art zugegriffen werden. Ein
Beispiel ist das Ausgeben eines binären Baumes mit der Methode Inorder, bei der
zuerst der linke Teilbaum ausgegeben wird, dann die Daten der Wurzel und
anschließend der rechte Teilbaum. Diese Vorschrift wird rekursiv auf jeden Teilbaum
angewandt. Für den unter 2.4 angegebenen binären Baum ergibt sich die
Zeichenfolge d, b, e, a, f, h, g, c.
Bei einem speziellen binären Baum, dem Suchbaum, sind alle Daten im linken Teil­
baum kleiner als die Daten der Wurzel und die Daten der Wurzel kleiner als alle
Daten im rechten Teilbaum. Diese Regel wird rekursiv auf jeden Teilbaum ange­
wandt.
Aus den Definitionen von Inorder und Suchbaum folgt, dass die Methode Inorder bei
einem Suchbaum die Daten der Knoten in der sortierten Reihenfolge liefert. Diese
Begründung ist anspruchsvoll.
3.7 Speichern von Bildern
Das folgende Bild gibt die Farbe der Pixel eines Schwarzweißbildes an:
0
0
0
0
1
1
0
0
0
0
0
0
1
1
1
0
1
1
0
0
1
1
0
0
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
Das Bild wird in vier Quadranten aufgeteilt. Der erste Quadrant (rechts oben) besteht
ausschließlich aus Nullen. Daher wird für ihn eine 0 gespeichert. Der zweite
Quadrant (links oben) besteht aus Nullen und Einsen. Er wird wiederum in
Quadranten zerlegt. Diese vier Quadranten bestehen einheitlich aus jeweils vier
Nullen oder aus vier Einsen. Für den zweiten Quadranten wird (1,0,0,0) gespeichert.
Der dritte Quadrant (links unten) besteht aus Nullen und Einsen. Er wird weiter
zerlegt und es zeigt sich, dass zwei dieser Quadranten nur aus Nullen bzw. nur aus
Einsen bestehen und dass die beiden anderen Quadranten gemischt sind. Es ergibt
sich ((0,1,1,0),1,(1,0,0,0),0). Der vierte Quadrant (rechts unten) besteht einheitlich
aus Einsen. Daher wird für ihn eine 1 gespeichert. Das ganze Bild kann mit
(0,(1,0,0,0),((0,1,1,0),1,(1,0,0,0),0),1) gespeichert werden. Diese Zeichenfolge
könnte in einen Viererbaum überführt werden und es könnten rekursive
Unterprogramme zur Arbeit mit dem Baum angegeben werden. Ein Beispiel dafür ist
10
das Drehen des Bildes um 90°, was durch Rotation der Knoten auf allen Ebenen des
Viererbaumes realisiert wird (vgl. Dewdney, 1995).
3.8 Suchen in einem Labyrinth
Die Labyrinthsuche ist ein Beispiel für das Problemlösungsverfahren Backtracking
(deutsch: Rückspuren, vgl. Kerner, 1990). Gesucht werden in einem rechteckigen
Labyrinth alle Wege von einem Start- zu einem Zielfeld. Als Modell für das Labyrinth
eignet sich ein zweidimensionales Array, dessen Elemente Zeichen sind. Nullen
stellen die Wege, Einsen die Mauern oder Hecken dar. Zweien fassen das Labyrinth
ein. Das Zeichen A symbolisiert das Start- und das Zeichen B das Zielfeld. Die
Prozedur Schritt führt einen zulässigen Schritt in dem Labyrinth aus und garantiert,
dass im Suchprozess alle Varianten ausprobiert und dass Zyklen bei der Suche
ausgeschlossen werden. Nach einem zulässigen Schritt erfolgt ein rekursiver Aufruf
der Prozedur Schritt (vgl. Fothe, 2001). In einer Projektarbeit können die Schülerin­
nen und Schüler ein vorgegebenes Programm für rechteckige Labyrinthe analysieren
und es dann z. B. so modifizieren, dass es bei räumlichen Labyrinthen funktioniert.
Bei einem räumlichen Labyrinth gibt es mehrere ebene Labyrinthe übereinander, die
durch Leitern an einem oder an mehreren Feldern miteinander verbunden sind.
3.9 Hilbert-Kurven
Das Problem kann in zwei Teilprobleme aufgeteilt werden. Das erste Teilproblem
besteht darin, die Ordnung der Hilbert-Kurve einzulesen und eine Folge von
Zeichenanweisungen zu erzeugen. Für die Hilbert-Kurve H2 (vgl. Abschnitt 2.2) ergibt
sich die Folge SWNWWSESWSEENES. Das zweite Teilproblem besteht darin, diese
Zeichenanweisungen einzulesen, zu interpretieren und eine Folge von gleich langen
Strecken auf dem Bildschirm auszugeben. Das Programm zur Lösung des ersten
Teilproblems enthält die vier rekursiv arbeitenden Prozeduren A, B, C und D. Nach­
folgend ist exemplarisch der Quelltext der Prozedur A in Oberon-2 angegeben (die
anderen drei Prozeduren besitzen ähnlichen Aufbau).
PROCEDURE A(i: INTEGER);
BEGIN
IF i > 0 THEN
D(i - 1); Out.Char("W"); (* ein Schritt nach Westen *)
A(i - 1); Out.Char("S"); (* ein Schritt nach Sueden *)
A(i - 1); Out.Char("E"); (* ein Schritt nach Osten *)
B(i - 1)
END
END A;
Es gibt auch andere Verfahren zum Zeichnen von Hilbert-Kurven (vgl. Nievergelt/
Hinrichs, 1993).
3.10 Syntaxanalyse
Eine Möglichkeit für die Syntaxanalyse ist das Befolgen der Regel, dass sich die
grammatikalische Struktur einer Sprache in der Struktur des Parsers widerspiegeln
soll. Besitzt eine Sprachbeschreibung eine rekursive Struktur, so wird das entspre­
chende Programm zur Syntaxanalyse ebenfalls rekursiv aufgebaut sein (vgl. Wirth,
1986). Das Erarbeiten eines einfachen Parsers eignet sich als Projektarbeit für
besonders interessierte Schülerinnen und Schüler.
11
4 Resümee
Bereits in der SI können einfache rekursive Problemlösungen erarbeitet werden. Die
erworbenen Kenntnisse und Fähigkeiten lassen sich ohne Brüche schrittweise bis hin
zum Bearbeiten von größeren Projekten in der SII ausbauen. Dabei können
Probleme bearbeitet werden, die aus unterschiedlichen Gebieten stammen. Einige
von ihnen besitzen eine erhebliche Relevanz in Anwendungen. Theoretische und
praktische Aspekte der Rekursion lassen sich im Unterricht gut miteinander verbin­
den.
Literaturverzeichnis:
Baumann, R.: Didaktik der Informatik. Klett Stuttgart, München, Düsseldorf, Leipzig 21996
Clocksin, W. F.; Mellish, C. S.: Programmieren in Prolog. Springer Berlin, Heidelberg, New York 1990
Dewdney, A. K.: Der Turing Omnibus. Eine Reise durch die Informatik mit 66 Stationen. Springer Ber­
lin, Heidelberg, New York 1995
Fothe, M.; Kerner, I. O.: Problem des Lucas. Wurzel, Jena 2/88, S. 18-23
Fothe, M.: Problemlösen mit OBERON. Konzeption und Einsatz eines elektronischen Lehrbuchs. LOG
IN 21 (2001) Heft 2, S. 33-40
Fothe, M.: Problemlösen mit Python. Reihe „Materialien“, Heft 72 des ThILLM Bad Berka 2002 (auch
im Internet)
Fothe, M.: Zeitverhalten von Sortierverfahren – Beispiele für experimentelles Arbeiten im Informatik­
unterricht. In: Hubwieser, P. (Hrsg.): Informatische Fachkonzepte im Unterricht, INFOS 2003. Lecture
Notes in Informatics (LNI). Bonn 2003, S. 111-120
Heyderhoff, P. (Hrsg.): Bundeswettbewerb Informatik. Aufgaben und Lösungen, Band 2. Klett Stuttgart
1990
Hubwieser, P.: Didaktik der Informatik. Grundlagen, Konzepte, Beispiele. Springer Berlin, Heidelberg,
New York 2000
Kerner, I. 0.: Informatik. Deutscher Verlag der Wissenschaften Berlin 1990
Nievergelt, J.; Hinrichs, K. H.: Algorithms and Data Structures. With Applications to Graphics and
Geometry. Prentice Hall Englewood Cliffs 1993
Rechenberg, P.: Quo vadis Informatik? LOG IN 17 (1997) Heft 1, S. 25-32
Schubert, S.; Schwill, A.: Didaktik der Informatik. Spektrum Akademischer Verlag Heidelberg, Berlin
2004
Wagenknecht, C.: Rekursion. Ein didaktischer Zugang mit Funktionen. Dümmler Bonn 1994
Winkler, J. F. H.; Nievergelt, J.: Wie soll die Fakultätsfunktion programmiert werden? InformatikSpektrum 12, 4 (1989) 220-221
Wirth, N.: Compilerbau. Teubner Stuttgart 41986
Dieser Internet-Beitrag entstand auf der Grundlage des folgenden Aufsatzes:
Fothe, M.: Rekursion. Ein Thema für den Informatikunterricht. LOG IN, Heft Nr. 133 (2005), S. 46-54
12
Zugehörige Unterlagen
Herunterladen