vorige nächste

Programmierung einer doppelten Schleife

Im Zusammenhang finden Sie dies Beispiel unter den Programmen zum Problem der Acht Damen.
;;; ===== Suchraum =========================================
; Die Funktion erzeugt den Suchraum: '((1 . 1) (1 . 2) ... )'
(define
  Suchraum
  (let loop
    ((zeile 8)
     (spalte 8)
     (akku ()))

    (cond

      ((zero? zeile)
       akku)

      ((zero? spalte)
       (loop (sub1 zeile) 8 akku))

      (else

       (loop
        zeile
        (sub1 spalte)
        (cons (cons zeile spalte) akku))))))

 
 
 

Anmerkung: Es handelt sich hierbei eigentlich nicht um eine Funktion, sondern um eine Variable. Sie wird beim Übersetzungsvorgang des Programmes mit dem beschriebenen Wert belegt und ihr Wert kann dann von den anderen Prozeduren aufgerufen werden.

Die Programmtechnik ist ein typisches Beispiel einer geschachtelten, doppelten Schleife in Scheme.

Im Kopf werden zwei Schleifenvariable definiert, nämlich die für den Spaltenindex und die für den Zeilenindex. Die lokale Variable akku ist notwendig, da nicht normal rekursiv, sondern endrekursiv (also prinzipiell iterativ) gearbeitet wird.

Eine doppelte Schleife entsteht dadurch, dass der Körper der Schleife zwei Abfragen enthält, nämlich nach den Werten der beiden lokalen Variablen zeile und spalte. Die äußere Schleife muss dabei zuerst abgefragt werden - allgemeine Regel: immer erst den Abbruchfall testen!

Entsprechend muss der Abbruchfall der inneren Schleife danach getestet werden, damit zur nächsten Zeile gewechselt werden kann, bevor der "Normalfall" des Aufrufs des nächsten Spaltenelementes durchgeführt werden kann.