TuH2 scheme
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
=== Scheme Programmbeispiele ===
Für die Ausführung der Hauptprogramme sind diverse Hilfsprozeduren nötig.
*zzls - Erstellt eine Zufallszahlenliste
*mv-mergesort - Sortiert eine Liste
*teillisten2 - teilt eine Liste; wird von mv-mergesort und binaersuche benötigt
*verbinden - verbindet zwei Listen; wird von mv-mergesort benötigt
Der Programmcode der Hilfsprozeduren ist am Schluss dieser Wikiseite zu finden.
=== Hilfsprozeduren ===
== zzls ==
<code>
;zzls für ZufallsZahlenListe. Generiert eine Liste mit n paarweise verschiedenen Ganzen Zahlen zwischen a und b.
;Beispielaufruf:
;>(zzls 10 100 1000) ; Zufallszahlenliste mit 1000 Zufallszahlen zwischen 10 und 100
(define zzls
(lambda (a b n)
(if (= n 0)
(list)
(let ((x (random b)))
(if (> x a)
(append (list x)(zzls a b (- n 1)))
(zzls a b n))))))
</code>
== mv-mergesort ==
Die Prozedur ist aus "Teilen und Herschen 1" bekannt. Sie sortiert eine gegebene Liste der Größe nach.
<code>
;mv-mergesort
(define mv-mergesort
(lambda (ls)
(if (or (null? ls)(null? (cdr ls)))
ls
(call-with-values
(lambda () (teillisten2 ls))
(lambda (ls1 ls2)
(verbinden
(mv-mergesort ls1)
(mv-mergesort ls2)))))))</code>
== teillisten2 ==
Teilt eine Liste in zwei Teillisten.
<code>
(define teillisten2
(lambda (ls)
(let ((k (floor (/ (length ls) 2))))
(letrec
((helfer
(lambda (ls i)
(if (= i 0)
(values '() ls)
(call-with-values
(lambda ()(helfer (cdr ls)(- i 1)))
(lambda (links rechts)
(values (cons (car ls) links) rechts)))))))
(helfer ls k)))))
</code>
== verbinden ==
Verbindet zwei Listen zu einer einzigen Liste
<code>
(define verbinden
(lambda (lls rls)
(cond
((null? lls) rls)
((null? rls) lls)
(else
(let ((x (car lls))(y (car rls)))
(if (< x y)
(cons x (verbinden (cdr lls) rls))
(cons y (verbinden lls (cdr rls)))))))))
</code>