Gymnasium Löbau/Vertiefungsklasse 2010/Turtlegrafik (III)

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Java</language>
== Selbstähnlichkeiten ==

=== Der Binärbaum ===

Zunächst betrachten wir das nachfolgende Grafikobjekt, das wir als Binärbaum bezeichnen wollen.
Dabei fällt auf, dass jeder Ast wieder ein kleiner Binärbaum ist.<br />
Wir wollen diese ''Selbstähnlichkeit'' zu seiner Beschreibung ausnutzen:<br /> 

<table>
<tr>
<td width="380" align="center" valign="top">[[Bild:Binärbaum1.gif]]</td>
<td width="920" align="left" valign="top">
<blockquote>
'''Beschreibung:'''
* Der einfachste Binärbaum besteht aus einem Stamm.
* Jeder andere Binärbaum besteht aus einem Stamm sowie einem vereinfachten linken und einem vereinfachten rechten Binärbaum.
</blockquote>
</td>
</tr>
</table>

Wir stellen fest, dass es durchaus sinnvoll sein kann, Objekte mit sich selbst zu beschreiben.<br />
Mit der Turtlegrafik wollen wir eine gleichwertige Implementation vornehmen. Dazu definieren wir den Baum ''mit sich selbst''.<br />

<table>
<tr>
<td width="380" align="center" valign="top">
<canvas w="380" h="350"></canvas>
</td>
<td width="920" align="left" valign="top">

<code id="53762e8707c45">
public void baum(Object turtle, double x, int n) {
 if (n > 0) {
  turtle.forward(x);
  turtle.left(45);
  baum(turtle, 2 * x / 3, n - 1);
  turtle.right(90);
  baum(turtle, 2 * x / 3, n - 1);
  turtle.left(45);
  turtle.backward(x);
 }
}
</code>

<run id="53762e8707ce2">
canvas1.clear();
turtle1.move(190, 300);
baum(turtle1, 100, 6);
</run>
</td>
</tr>
</table>

Prozeduren, die mit sich selbst definiert werden, heißen ''rekursive''<sup>1)</sup> ''Prozeduren''.<br />
Rekursionen stellen ein ''leistungsstarkes und universelles Konzept'' zur Problemlösung dar.<br />

<sup>1)</sup> recurrere (lat.): "zurücklaufen"

=== Die "Quadratschnecke" ===

'''Beschreibung:'''
* Die einfachste Quadratschnecke besteht aus einer Strecke.
* Jede andere Quadratschnecke besteht aus einer Strecke, einer Drehung um 90° sowie einer etwas verkürzten Quadratschnecke.

<table>
<tr>
<td width="380" align="center" valign="top">
<canvas w="380" h="300"></canvas>
</td>
<td width="920" align="left" valign="top">

<code id="537632102b602">
public void quadschnecke(Object turtle, double x) {
 if (x > 0) {
  turtle.forward(x);
  turtle.right(90);
  quadschnecke(turtle, x - 2);
 }
}
</code>

<run id="537632102b6a9">
canvas2.clear();
turtle2.move(100, 250);
quadschnecke(turtle2, 200);
</run>
</td>
</tr>
</table>