Backtracking: Das 8-Damen-Problem im Video

(2 Kommentare.)

Acht Stunden sieht der Lehrplan für Rekursion vor, acht Stunden, das ist absurd wenig für das, was sich das Schulbuch zumindest anbietet – Fakultät, Palindrom, Fibonacci, Ackermann, größter gemeinsamer Teiler, Hanoi, selbstähnliche Kurven (Sierpinksi, Hilbert, Pythagorasbaum, Drachenkurve); Rucksack- und 8-Damen-Problem; Tiefensuche, Tiefensuche-Varianten und Vergleich mit Dijkstra, Breitensuche. Natürlich muss man nicht alles davon machen, aber viel davon auch implementieren. Und Backtracking ist nichts, was leicht fällt.

Der Lehrplan, mit seiner unsinnigen Trennung von Kompetenzerwartungen und Inhalten, sieht für diese 8 Stunden zu je 45 Minuten vor:

Kompetenzerwartungen

Die Schülerinnen und Schüler …

  • analysieren rekursive Algorithmen und erläutern das Prinzip der Rekursion. Dabei vergleichen sie iterative und rekursive Algorithmen für geeignete Problemstellungen.
  • implementieren rekursive Algorithmen zur Lösung von Problemen und Aufgaben, wie z. B. Berechnung des ggT, Erzeugung selbstähnlicher Figuren, Türme von Hanoi.
  • erläutern die Idee der Tiefensuche in Graphen, formulieren den zugehörigen Algorithmus und wenden diesen an konkreten Beispielen an.
  • implementieren die Tiefensuche in Graphen und modifizieren den Algorithmus in geeigneter, vom Anwendungskontext abhängiger Weise, z. B. bei der Auswahl oder Bearbeitung aller erreichbaren Knoten mit bestimmten Eigenschaften.

Inhalte zu den Kompetenzen:

  • Rekursion: rekursiver Aufruf, Abbruchbedingung, lineare und verzweigte Rekursion
  • Tiefensuche

Nun ja. Ich habe für meinen Kurs versucht, das 8-Damen-Problem zu veranschaulichen:

In Java wäre das:

void loesungsmethode(int spalte) {  
    for (int zeile=0; zeile<8; zeile++) {
        if ( feldIstMoeglich(zeile, spalte) ) {
            setzeDame(zeile, spalte);
            if (spalte==7) druckeSchachbrettAus();
            else loesungsmethode(spalte+1);                    
            entferneDame(zeile, spalte);
        }
    }
}

Gestartet wird das mit dem Aufrufen von loesungsmethode(0) für die erste Spalte. Wenn das Ergebnis gefunden ist, muss man es ausgeben, weil bei diesem Vorgehen ja nach und nach alle je gesetzten Damen wieder entfernt werden. (Man kann es auch schwieriger machen, siehe Schulbuch. Die Methoden setzeDame und entferneDame erleichtern den Zugriff auf das Schachbrett, das dort als ArrayList<ArrayList<Boolean>> modelliert ist. Meine Güte.)

void setzeDame(int zeile, int spalte) {
    schachbrett.get(zeile).set(spalte, true);
 }
void entferneDame(int zeile, int spalte) {
    schachbrett.get(zeile).set(spalte, false);
}

Nachtrag:

Auch sonst bin ich mit dem an sich sehr guten Buch in manchen Punkten doch nicht zufrieden. Der Pseudocode für die rekursive Methode der Tiefensuche lautet:

methode KnotenBesuchen(aktuell:GANZZAHL)
besuchteKnoten.Hinzufügem(aktuell)
...

Zur bayerischen Unsitte, die Methodenbezeichner mit Großbuchstaben anfangen zu lassen und im Infinitiv zu verfassen (selber bin ich Team „besucheKnoten“), sage ich mal nichts. Dass mit GANZZAHL versucht wird, das ganze abstrakt und sprachunabhängig zu halten, verstehe ich. Aber mit der Zeile „besuchteKnoten.Hinzufügen(aktuell)“ lege ich mich doch schon wieder darauf fest, eine ArrayList<Integer> für die markierten Knoten zu verwenden, und dann auch eine ArrayList<ArrayList<Integer>> für die Adjazenzmatrix zu verwenden, und nicht jeweils Arrays, was für die Schüler und Schülerinnen sehr viel anschaulicher wäre. Warum nicht allgemeiner:

methode KnotenBesuchen(aktuell:GANZZAHL)
markiereAlsBesucht(aktuell)
...

und der Implementierung überlassen, wie man den Knoten als besucht markieren will? Die Möglichkeit, ein Attribut „besucht“ für jeden Knoten anzulegen, wird immerhin in einer Aufgabe vorgeschlagen.


Beitrag veröffentlicht am

in

Kommentare: 2

Schlagwörter:

Kommentare

2 Antworten zu „Backtracking: Das 8-Damen-Problem im Video“

  1. Aginor

    Uff, das ist schon eine Menge Stoff für nur acht Schulstunden.

    IMHO könnte man alleine mit dem traveling salesman (Dijkstra ist dabei aber eine gute Wahl) schon vier oder mehr davon verbringen, wenn man vorhat das einigermaßen zu verstehen.

    Und für „Dabei vergleichen sie iterative und rekursive Algorithmen für geeignete Problemstellungen“ mag ich z.B. Sortieralgorithmen (BubbleSort vs. SelectionSort vs. QuickSort) gerne, aber das sind auch wieder eher vier Stunden als nur eine oder zwei.

    Hut ab aber dafür dass das alles auf dem Lehrplan steht!
    Es wird ja viel geschimpft allerorts, daher muss ich auch hier wieder hervorheben: Der Informatikunterricht ist offenbar Welten besser als das was ich damals (vor 25 Jahren) genießen durfte.

    Beim benennen von Funktionen/Methoden bin ich bei Ihnen, verb+Objekt ist auch meine bevorzugte Benamung derselben.
    Wobei ich noch ab und an oldschool den Datentyp des Rückgabewerts als Kürzel drin habe (wäre hier dann vBesucheKnoten). Aber ich sehe auch ein dass das aus der Mode gekommen ist. IDEs sagen einem das ja heutzutage.

    Gruß
    Aginor

  2. Der bayerische Informatikunterricht fängt so richtig erst vor 20 Jahren mit dem Pflichtfach an, jedenfalls am Gymnasium; auch an der Realschule sah er vorher ganz anders aus als heute. Der Lehrplan ist schon okay, und diese Inhalte sind halt wirklich erst in der Oberstufe, wo sich nur die hin trauen, die das Programmieren nicht abgeschreckt hat.
    vBesucheKnoten – die Konvention kannte ich gar nicht. Für die Schule wäre das vielleicht sogar hilfreich; das mti dem Rückgabetyp verlieren viele schnell aus dem Blick.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert