Algorithmen und Datenstrukturen – Übung 1 Die folgenden Lösungen sind allesamt Lösungsvorschläge. Bei einigen Aufgaben gibt es tatsächlich nur eine Lösung, im allgemeinen kann es aber mehrere Lösungswege geben. Wenn Sie nicht sicher sind, ob Ihre Lösung äquivalent zu den dargestellten Lösungen ist, fragen Sie bitte nach. Aufgabe 1 Skizzieren Sie verschiedene nicht-deterministische Möglichkeiten (unter Beachtung der Vorrangregeln), die folgende Formel schrittweise auszuwerten: 2 * (25 + 3 * (4 + 5)) - 314 - 4 * 63 Lösungsvorschlag: Als Skizzierungsmöglichkeiten gibt es Baumdarstellung, natürliche Sprache, Ablaufdiagramme. Wichtig ist, daß erkannt wird, daß der Term drei unterschiedliche Auswertungsanfänge hat: ● -4 * 36 ● -314 ● 2 * (25 + 3 * (4 + 5)) Ausgehend davon kann nach einem Start nochmals nach zwei Möglichkeiten unterschieden werden, so daß insgesamt 3 * 2 * 1 = 6 verschiedene Auswertungsmöglichkeiten vorliegen. Aufgabe 2 Ein Bonbonglas ist mit mit vielen Lakritzeschnecken und Gummibärchen gefüllt. Außerdem liegt neben dem Glas eine "Wundertüte", die unerschöpflich viele Lakritzeschnecken enthält. Der folgende Vorgang soll nun solange ausgeführt werden, bis er sich nicht mehr wiederholen läßt: • • • Entnehmen Sie zwei beliebige Süßigkeiten aus dem Glas. Falls beide die gleiche Geschmacksrichtung haben, essen Sie sie auf und füllen eine Lakritzeschnecke aus der nebenstehenden Tüte in das Glas. Haben Sie eine Lakritzeschnecke und ein Gummibärchen gezogen, dürfen Sie nur die Lakritzeschnecke naschen. Das Gummibärchen müssen Sie wieder in das Glas zurücklegen. Folgende Fragen drängen sich auf: 1. Terminiert dieser Vorgang? 2. Wieviel Süßigkeiten verbleiben im Glas? 3. Ist der Vorgang determiniert oder deterministisch? Lösungsvorschlag: 1. Da beide Entnahmemöglichkeiten (zwei gleiche oder zwei unterschiedliche Süssigkeiten) zu einer Verringerung des Gesamtinhalts führen, ist irgendwann das Glas leer, also terminiert dieser Vorgang. 2. Entweder 0 oder 1 3. (Achtung, Korrektur zur Aussage in der Übung) Da das Ziehen und der daraus resutlierende nächste Schritt zufällig ist, ist der Algorithmus nicht deterministisch. Da durch die Zufallsziehung auch das Ergebnis variiert (ganz abgesehen von der Abhängigkeit durch die Eingabemenge), ist der Algorithmus auch nicht determiniert. Aufgabe 3 Formulieren Sie einen (intuitiven) terminierenden, deterministischen Algorithmus für die Rechenoperation Addition über den natürlichen Zahlen = {0, 1, 2, 3, ...}. Die natürlichen Zahlen sollen als Dezimalzahlen dargestellt werden. Bei der Addition zweier natürlicher Zahlen x, y mit dem Ergebnis z (z = x + y) dürfen nur die elementaren Operationen Erhöhung und Verminderung einer natürlichen Zahl um Eins (Inkrement und Dekrement) und die Vergleichsoperation '=' verwendet werden. Machen Sie plausibel, daß Ihr Algorithmus für alle erlaubten Werte terminiert. Erläutern Sie den Algorithmus am Beispiel Ihrer Wahl. Lösungsvorschlag: Der folgende Lösungsvorschlag ist in Pseudocode geschrieben: int x, y, z; until (y = 0) { x++; y--; } z = x; In z steht nun das Additionsergebnis. Aufgabe 4 Formulieren Sie einen weiteren (intuitiven) terminierenden, deterministischen Algorithmus für die Rechenoperation Division über den natürlichen Zahlen = {0, 1, 2, 3, ...}. Die natürlichen Zahlen sollen als Dezimalzahlen dargestellt werden. Die Division zweier natürlicher Zahlen x, y , y 0 liefert das ganzzahlige Ergebnis z und den ganzzahligen Rest r , so daß gilt x = z * y + r mit 0 r < y. Zulässige Elementaroperationen sind die Addition und Subtraktion zweier beliebiger natürlicher Zahlen, sowie die Vergleichsoperation " ". Machen Sie plausibel, daß Ihr Algorithmus für alle erlaubten Werte terminiert. Erläutern Sie den Algorithmus am Beispiel Ihrer Wahl. Lösungsvorschlag: Der folgende Lösungsvorschlag ist in Pseudocode geschrieben: int x, y, z, r; until (x <= y) { x = x - y; z++; } r = x; In z steht nun das Divisionssergebnis, in r der Rest.