TuH2 scheme
Inhaltsverzeichnis |
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.
Der Scheme-Interpreter versteht das Sprachelement random zunächst noch nicht. Eine hier "versteckte" Prozedur definiert eine "Glücksrad-Fabrik", die im Folgenden einmalig aufgerufen werden muss, um unseren Zufallszahlen-Generator (random) zu erzeugen.
Nun können wir random beliebig oft benutzen. Probieren Sie das bitte.
<eval>(random 12)</eval>
Hauptprogramme
Beispielliste
Zu Anfangs definieren wir uns eine Liste mit Zufallszahlen. Dazu verwenden wir die Hilfsprozedur zzls. Die Liste soll aus 20 Zahlen zwischen 1 und 100 bestehen.
Anschließend soll die Liste aufsteigend sortiert werden. Dazu verwenden wir die Hilfsprozedur mv-mergesort. Die sortierte Liste wird in liste2 gebunden.
einfache Binaere Suche
Die Prozedur erwartet als Argumente die Gesuchte Zahl und eine sortierte Eingabeliste. Wenn die gesuchte Zahl gefunden wurde, erhält man die Ausgabe "Schlüssel gefunden", andernfalls die Ausgabe "Schlüssel nicht Enthalten". Der Index des gesuchten Begriffs wird nicht zurückgegeben.
<eval>(binaersuche 42 liste2)</eval>
Dieses Ergebnis ist noch recht unbefriedigend. Wir erweitern die Prozedur deshalb um zwei Funktionalitäten:
- Die Anzahl der rekursiven Aufrufe soll festgehalten werden. Dies wird für die Empirische Effizienzanalyse benötigt.
Dazu wird ein Zähler calls definiert, der vor jedem rekursiven Aufruf inkrementiert wird. Nach Abarbeitung der Prozedur kann dieser Zähler zur Analyse herangezogen werden.
- Es soll nicht nur herausgefunden werden, ob ein Element in der Liste enthalten ist, sondern auch die Stelle des gefundenen Elements innerhalb der Liste.
Wir definieren für die Eigentliche Suche die Prozedur binsuche und für den Aufruf die Prozedur binaersuche2. Diese hat die Aufgabe sicherzustellen, dass der Rekursionszähler und der Index-Zähler vor jedem Aufruf auf 0 gesetzt wird.
Binaersuche2
<eval>(binaersuche2 42 liste2)</eval>
Nachdem man die Suche durchgeführt hat, kann man die Variable calls zur Empirischen Effizienzanalyse auswerten.
Zum Vergleich hier eine Implementierung der Sequenziellen Suche mit Zähler.
Auch hier kann im Anschluss die Zählervariable calls ausgewertet werden. Bei einer sortierten Liste entspricht die Anzahl der Rekursionsaufrufe gleichzeitig auch dem Index des gesuchten Elements (sofern das Element enthalten ist).
Hilfsprozeduren
zzls
mv-mergesort
Die Prozedur ist aus "Teilen und Herschen 1" bekannt. Sie sortiert eine gegebene Liste der Größe nach.
teillisten2
Teilt eine Liste in zwei Teillisten.
verbinden
Verbindet zwei Listen zu einer einzigen Liste