Informatik Bachelor 1. Semester WS 2016/17 Prof. Dr. Wolfgang Schramm Algorithmen und Datenstrukturen (ADS)
Ubungsblatt 1 ¨
Ausgabe: 26.10.2016
Abgabe: 3.11.2016 (23:50 Uhr)
Aufgabe 1: Eigenschaften von Algorithmen 25 Punkte
Ein Bonbonglas ist mit vielen Lakritzeschnecken und Gummib¨archen gef¨ullt. Außerdem liegt neben dem Glas eine ”Wundert¨ute”, die unersch¨opflich viele Lakritzeschnecken enth¨alt. Der folgende Vorgang soll nun solange ausgef¨uhrt werden, bis er sich nicht mehr wiederholen l¨asst:
(1) Entnehmen Sie zwei beliebige S¨ußigkeiten aus dem Glas.
(2) Falls beide die gleiche Geschmacksrichtung haben, essen Sie sie auf und f¨ullen eine Lakritzeschnecke aus der nebenstehenden T¨ute in das Glas.
(3) Haben Sie eine Lakritzeschnecke und ein Gummib¨archen gezogen, d¨urfen Sie nur die Lakritzeschnecke naschen. Das Gummib¨archen m¨ussen Sie wieder in das Glas zur¨ucklegen.
Folgende Fragen dr¨angen sich auf bzw. sind von Ihnen zu beantworten:
a) Terminiert dieser Vorgang?
b) Wieviele S¨ußigkeiten verbleiben im Glas?
c) Ist der Vorgang determiniert oder deterministisch? Eine einfache Antwort gen¨ugt nicht! Sie m¨ussen je- weils eine stichhaltige Begr¨undung angeben. Hinweis: Ich empfehle Ihnen, bei praktischen Untersuchun- gen des Problems die Werte f¨ur n (Anzahl der Gummib¨archen) und m (Anzahl der Lakritzeschnecken) nicht zu groß zu w¨ahlen, da u.a. wegen des S¨ußholzanteils in Lakritze eine Gallenkolik wahrscheinlich ist und das L¨osen der Aufgabe erheblich beeintr¨achtigt. [Die Aufgabe stammt von Prof. Dumke, Uni Magdeburg].
Hinweis:Einfache Antworten, etwa in Form von Behauptungen, gelten nicht. Jede Antwort muss formal sauber begr¨undet werden!
Aufgabe 2: Tic Tac Toe 20 Punkte
Tic Tac Toe ist ein Spiel f¨ur zwei Personen, die in einem drei-mal-drei großen Spielfeld abwechselnd eine Marke – typischerweise
”Kreuz“ und
”Kreis“ – setzen. Gewonnen hat der Spieler, der zuerst drei Marken in einer Linie – senkrecht, waagrecht oder diagonal – gesetzt hat.
Schreiben Sie eine FunktiongewinnerIst, die f¨ur eine gegebene Spielsituation ¨uberpr¨uft, ob es einen Sieger gibt und ggf. wer der Sieger ist. M¨ogliche Ergebnisse sind:
• ”Kreuz“, falls der Kreuze setzende Spieler gewonnen hat, d.h. es gibt genau eine Linie von drei Marken, n¨amlich eine mit drei Kreuzen (z.B. siehe unten mittleres K¨astchen),
• ”Kreis“, analog,
• ”none“, falls es keinen Gewinner gibt, d.h es gibt noch keine Linie von drei Marken (z.B. siehe unten linkes K¨astchen), oder es gibt mehr als eine Linie von drei Marken (von einem oder verschiedenen Spielern) (z.B. siehe unten rechtes K¨astchen).
X X O
O
X
O X O
X O
O X X
O O O
O X X
1
Schreiben Sie eine Funktion gewinnerIst in Pseudocode, die f¨ur ein mit 9 oder weniger Marken belegtem Spielfeld bestimmt, ob es einen Gewinner gibt, und falls ja, wer gewonnen hat.
Hinweise
Ihre Funktion soll in folgendem Pseudocode-St¨uck verwendet werden k¨onnen:
lese Spielfeld;
if gewinnerIst(Spielfeld) = Kreis then
schreibe "Gewinner ist Kreis"
else if gewinnerIst(Spielfeld) = Kreuz then
schreibe "Gewinner ist Kreuz";
else
schreibe "Es gibt keinen Gewinner";
fi fi
Das Spielfeld besteht aus 9 Feldern, die in 3 Reihen oder in 3 Spalten gruppiert werden k¨onnen, die jeweils aus 3 Feldern bestehen. Entscheiden Sie sich f¨ur eine der beiden M¨oglichkeiten, d.h. Sie k¨onnen nicht einmal reihenweise, einmal spaltenweise arbeiten (Falls Sie reihenweise arbeiten: was ist dann eine Spalte? Offensichtlich enth¨alt sie aus jeder der drei Reihen ein Feld.)
Sie k¨onnen eine Funktion
funct enthaelt (Feld, Marke) returns boolean
nutzen, die true liefert, falls die Marke (d.h. Kreuz oder Kreis) sich auf dem Feld befindet – andere Funktionen zum ¨Uberpr¨ufen des Inhalts des Spielfeldes k¨onnen Sie nicht als bekannt voraussetzen.
Aufgabe 3: Rekursiver Algorithmus 15 Punkte
Die Quersumme einer nat¨urlichen Zahl kann rekursiv definiert werden durch:
a) Die Quersumme einer Ziffer ist der Wert der Ziffer.
b) Die Quersumme einer mehrstelligen Zahl ist der Wert der letzten Ziffer plus die Quersumme der Zahl, die man erh¨alt, wenn man die letzte Ziffer abschneidet.
Entwickeln Sie einen rekursiven Algorithmus. Verwenden Sie explizit das aus der Vorlesung bekannte Sche- ma (dazu m¨ussen Sie das Schema auch, angewandt auf die konkrete Aufgabenstellung, hinschreiben) zur Entwicklung rekursiver Funktionen, und notieren Sie den Algorithmus als Funktion in Pseudocode.
Hinweise:
• Die Funktion hat keine Ausgabe (
”drucke. . . “), und liefert die Quersumme als Ergebnis zur¨uck (return).
• Sie k¨onnen einfache Funktionen zum Manipulieren von Zahlen verwenden, z.B.letzte-Ziffer: liefert die letzte Ziffer, restlicheZiffern: liefert die Zahl, die nach dem Abschneiden der letzten Ziffer entsteht.
letzteZiffer(1459) = 9 restlicheZiffern(1459)=145
Aufgabe 4: Iteration und Rekursion 25 Punkte
Die Multiplikation zweier Nat¨urlicher Zahlen kann folgendermaßen definiert werden:
a·b=
( a+ (a·(b−1)), f alls b >1
a, f alls b= 1
Entwickeln Sie zwei Funktionen in Pseudocode f¨ur die Multiplikation, die ohne die Multiplikations-Operation auskommen:
a) Schreiben Sie einerekursiveFunktion in Pseudocode f¨ur diese Art der Multiplikation; nummerie- ren Sie die Zeilen der Funktion durch.
2
b) Notieren Sie den Ablauf f¨ur die Multiplikation von 3 und 4 in einem Protokoll. Das Protokoll besteht aus Zeilen, in denen Sie notieren
- die laufende Nummer des Aufrufes, - die Zeilennummer,
- die Operation, die ausgef¨uhrt wird (wobei Variable durch deren Wert ersetzt werden) mit derem Ergebnis,
- ein Hinweis, wo das Ergebnis weiter verwendet wird (z.B. textuell durch Aufrufnummer/Zei- lennummer, oder graphisch durch einen Pfeil).
- Notieren Sie nur die Zeilen f¨ur die rekursive oder terminierende Verarbeitung.
c) Schreiben Sie eineiterativeFunktion in Pseudocode f¨ur diese Art der Multiplikation; nummerieren Sie die Zeilen der Funktion durch.
d) Notieren Sie den Ablauf f¨ur die Multiplikation von 3 und 4 in einem Protokoll. Das Protokoll besteht aus Spalten (eine Spalte f¨ur die Zeilennummer und je eine Spalte je Variable, die in Ihrem Algorithmus vorkommt). Legen Sie immer eine neue Zeile an, wenn sich der Wert einer Variablen
¨andert. Markieren Sie die
”Eingaben“ und
”Ausgaben“ Ihrer Funktion.
Hinweise zub)
- laufende Nummer des Aufrufes: der Aufruf
”mult(3, 4)“ erh¨alt die Nr. 1; wird bei der Abarbeitung mult rekursiv aufgerufen, erh¨alt dieser die Nr. 2; etc.
- Notation der Operation: steht in ihrem Programm
”f(a,b)“ (Aufruf der Funktion f), so schreiben Sie in dem Protokoll - falls a den Wert 5, b den Wert 11 enth¨alt –
”f(5,11)“
- Es empfiehlt sich mit Einr¨uckungen zu arbeiten, um Ereignisse in verschiedenen Auf-rufen der Funktion zu unterscheiden (die Zeilennummer ist ja identisch!).
Hinweise zud)
- Falls einer Variablen noch kein Wert zugewiesen wurde, bleibt das Feld leer.
- Wird der Wert einer Variablen nicht ge¨andert, ¨ubernehmen Sie den Wert der vorhergehenden Zeile.
Beachten Sie: ein Ausdruck
”a + b“ ist nur definiert, falls a und b Zahlen in Ihrem Protokoll zugeordnet sind.
3