Hessischer Bildungsserver / Arbeitsplattformen

Einführung der Rekursion

Zur Einführung der Rekursion erhalten die Schüler die Aufgabe, Zeichenprozeduren für die folgenden vier Bilder zu entwickeln.

Generator

Den charakteristischen Generator (Bild 1) erhält man so:

procedure TFKoch.ZeichneKurve1 (Laenge: Real);
begin
with Turtle do begin
Draw(Laenge/3)
Turn(60);
Draw(Laenge/3)
Turn(-120);
Draw(Laenge/3)
Turn(60);
Draw(Laenge/3)
end;
end;
Streckenersetzung

Bild 2 erhält man am einfachsten durch Streckenersetzung aus Bild 1, in dem man jede Strecke von Bild 1 durch den Generator ersetzt. In der Zeichenprozedur muss dazu jeder Draw-Befehl durch den Aufruf der Zeichenprozedur für den Generator ersetzt werden. Damit die Größenverhältnisse stimmen muss die Länge gedrittelt werden.

procedure TFKoch.ZeichneKurve2 (Laenge: Real);
begin
ZeichneKurve1(Laenge/3);
Turtle.Turn(60);
ZeichneKurve1(Laenge/3);
Turtle.Turn(-120);
ZeichneKurve1(Laenge/3);
Turtle.Turn(60);
ZeichneKurve1(Laenge/3);
end;

Bild 3 lässt sich wiederum mittels Streckenersetzung mit Hilfe der Zeichenprozedur von Bild 2 zeichnen:

procedure TFKoch.ZeichneKurve3 (Laenge: Real);
begin
ZeichneKurve2(Laenge/3);
Turtle.Turn(60);
ZeichneKurve2(Laenge/3);
Turtle.Turn(-120);
ZeichneKurve2(Laenge/3);
Turtle.Turn(60);
ZeichneKurve2(Laenge/3);
end;
Rekursion

Gesucht ist nun eine Prozedur, mit welcher man das Bild mit der Nummer n erzeugen kann.

Vergleicht man die bisherigen Zeichenprozeduren miteinander, so fällt auf, dass sie sich letztlich nur in der Endung des Namens unterscheiden. Wir machen daher aus der Endung des Namens einen Parameter und erhalten folgende unvollständige Zwischenlösung:

procedure TFKoch.ZeichneKurve (n: Integer; Laenge: Real);
begin
ZeichneKurve(n-1, Laenge/3);
Turtle.Turn(60);
ZeichneKurve(n-1, Laenge/3);
Turtle.Turn(-120);
ZeichneKurve(n-1, Laenge/3);
Turtle.Turn(60);
ZeichneKurve(n-1, Laenge/3);
end;
Termination

Beginnen wir mit n = 4, so wird n der Reihe nach auf 3, 2, 1, 0, -1, -2, ... reduziert. Wir müssen also dafür sorgen, dass bei n = 0 die Turtle zeichnet. Daraus ergibt sich die endgültige Lösung:

procedure TFKoch.ZeichneKurve (n: Integer; Laenge: Real);
begin
if
n > 0 then begin
ZeichneKurve(n-1, Laenge/3); Rekursionsfall
Turtle.Turn(60);
ZeichneKurve(n-1, Laenge/3);
Turtle.Turn(-120);
ZeichneKurve(n-1, Laenge/3);
Turtle.Turn(60);
ZeichneKurve(n-1, Laenge/3);
end
else
Turtle.Draw(Laenge); direkter Fall
end;

Das Charakteristische dieser Prozedur ist, dass sie sich in ihrem Anweisungsteil selbst aufruft!

 Eine Prozedur heißt rekursiv, wenn sie sich in ihrem Anweisungsteil selbst aufruft.