(define (Rucksack-packen Gewicht Teilgewichte Ergebnis) (bkpt Gewicht Teilgewichte Ergebnis) (cond ((zero? Gewicht) ; Lösung gefunden ! Ergebnis) ((null? Teilgewichte) ; nicht voll erfüllt (cons "nicht exakt" Ergebnis)) ((< Gewicht (car Teilgewichte)) ; erster geht nicht (Rucksack-packen Gewicht (cdr Teilgewichte) Ergebnis)) (else ; einpacken und weiter (Rucksack-packen (- Gewicht (car Teilgewichte)) (cdr Teilgewichte) (cons (car Teilgewichte) Ergebnis)))))
Wird die Funktion nun - nach dem Einbau von bkpt - z.B. mit
(Rucksack-packen 101 '(30 30 30 20 20 20 15 15 5 3 2 1 1)) ())
Durch den bkpt werden nacheinander angezeigt:
101 (30 30 30 20 20 20 15 15 5 3 2 1 1) () 71 (30 30 20 20 20 15 15 5 3 2 1 1) (30) 41 (30 20 20 20 15 15 5 3 2 1 1) (30 30) 11 (20 20 20 15 15 5 3 2 1 1) (30 30 30) 11 (20 20 15 15 5 3 2 1 1) (30 30 30) 11 (20 15 15 5 3 2 1 1) (30 30 30) 11 (15 15 5 3 2 1 1) (30 30 30) 11 (15 5 3 2 1 1) (30 30 30) 11 (5 3 2 1 1) (30 30 30) 6 (3 2 1 1) (5 30 30 30) 3 (2 1 1) (3 5 30 30 30) 1 (1 1) (2 3 5 30 30 30) 0 (1) (1 2 3 5 30 30 30)
bevor die Unterbrechungen und Ausgaben beendet werden und das Ergebnis
(1 2 3 5 30 30 30)
angezeigt wird. Man kann auf diesem Wege gut beobachten, wie nacheinander die jeweils größten zulässigen Gewichte eingepackt werden, das noch zu füllende Restgewicht reduziert wird und weshalb einzelne Gewichtsstücke, beispielsweise das 15 - er verworfen werden.
Die Funktion bkpt ist also nicht nur für debugging - Zwecke sinnvoll, sondern auch allgemein zur Ablaufverfolgung einer Auswertung.