Technische Universität München Fakultät für Informatik Dr. C. Herzog, M. Maalej WS 2012/13 Übungsblatt 5 19. November 2012 Übungen zu Grundlagen der Programmierung Aufgabe 19 (H) Markov-Algorithmus Wir betrachten den Zeichenvorrat V = {a, b} Schreiben Sie einen Markov–Algorithmus, der zu einer Zeichenreihe w ∈ V ∗ als Eingabetext genau dann die Zeichenreihe "T" als Ausgabe liefert, wenn w von der Form " aa · · · a} bb · · · b} " mit | {z | {z n mal n mal einem n ∈ N0 ist. Wenn w nicht von dieser Form ist, soll er als Ausgabe die Zeichenreihe "F" liefern. Aufgabe 20 (H) Rekursion und Terminierung a) Eine Zeichenfolge x heißt Palindrom, wenn sie identisch zu ihrer gespiegelten Zeichenfolge ist (Bsp.: (’o’,’t’,’t’,’o’), (’a’,’d’,’a’)). Geben Sie eine Java-Funktion istPalindrom an, die feststellt, ob eine als Parameter übergebene Zeichenreihe ein Palindrom ist oder nicht, und als Ergebnis den entsprechenden Wahrheitswert (Typ boolean) liefert. Für Ihre Lösung können Sie sich auf alle bisher in der Übung eingeführten Funktionen für Zeichenfolgen abstützen. b) Geben Sie die Berechnung für den Aufruf istPalindrom((’o’,’t’,’t’,’o’)) an. c) Zeigen Sie für Ihre Funktion istPalindrom die Terminierung. Aufgabe 21 (H) Korrektheit rekursiver Funktionen Gegeben sei die Funktion summe2, die auf der Menge Z × Z wie folgt definiert ist: n mit m, n ∈ Z summe2(m, n) = ∑ i i=m a) Geben Sie eine rekursive Berechnungsvorschrift für die Funktion summe2 in Java an. b) Beweisen Sie mit Hilfe einer geeigneten Abstiegsfunktion die Terminierung Ihrer Java Funktion summe2 aus Teilaufgabe a). n c) Zeigen Sie, dass die Summenformel ∑ i mit Ihrer Java Funktion aus Teilaufgabe a) korrekt i=m berechnet wird. Bitte wenden! –2– Aufgabe 22 Kontrollstrukturen der imperativen Programmierung a) Mit der Zuweisung, die in Java mit dem „=“–Operationssymbol realisiert wird, können wir einer Variablen einen Wert (in Form eines Ausdrucks) zuweisen. Der Variablenname steht auf der linken Seite, der Ausdruck auf der rechten Seite des „=“–Operationssymbols. Geben Sie an, welche Werte die Variablen x und y während und nach der Ausführung des folgenden Programmstücks haben: int int y = x = x = x = 3; y = 2; (x+1) * (x+1); x+1; x*x; b) Bedingte Ausdrücke der Form Bedingung ? Ausdruck1 : Ausdruck2 können in Java durch die Kontrollstruktur der bedingten Anweisung if (Bedingung) Anweisung1; else Anweisung2; nachgebildet werden. Setzen Sie die Anweisung mit bedingtem Ausdruck return a==b ? a : a>b ? a-b : b-a in eine entsprechende bedingte Anweisung um. Aufgabe 23 Einbettung und iterative Lösung für rekursive Programme In dieser Aufgabe soll eine Java-Funktion maxVorkommen angegeben werden, die eine Zeichenfolge f als Eingabe erhält und als Ergebnis eines der Zeichen liefert, die maximales Vorkommen in f haben. Dabei gilt: Ein Zeichen c hat maximales Vorkommen in einer Zeichenfolge f, wenn es kein anderes Zeichen gibt, das öfter in f vorkommt als c. Definieren Sie dazu zunächst eine rekursive Funktion vorkommen, die ein Zeichen c und eine Zeichenfolge f als Eingabe erhält und als Ergebnis zurückliefert, wie oft c in f vorkommt. Aufgabe 24 (P) Fibonacci-Zahlen rekursiv a) Implementieren Sie rekursiv eine Java-Funktion, die die Fibonaccizahl zu gegebenem n berechnet. Die Berechnungsvorschrift ist rekursiv gegeben durch: für n > 1 fib(n − 1) + fib(n − 2) 1 für n = 1 fib(n) = 0 für n = 0 b) Testen Sie Ihre Funktion schrittweise für grössere n und geben Sie die benötigte Rechenzeit in Sekunden auf der Standardausgabe mittels System.out.println(""); aus. Zur Messung der aktuellen Systemzeit können Sie folgende Befehle verwenden: java.util.Calendar cal = java.util.Calendar.getInstance(); long t = cal.getTimeInMillis(); –3– Was für ein Effekt tritt bei steigendem n ein und wie erklären Sie sich diesen? Aufgabe 25 (P) Ersetzen von Teilzeichenfolgen Wir betrachten Zeichenfolgen x, y, z. Analog zu den Sequenzen ganzer Zahlen aus der Vorlesung heißt x Anfangsfolge von y, falls es eine Zeichenfolge v gibt, so dass y = conc(x, v) gilt. x heißt Teilfolge von y, falls es Zeichenfolgen u, v gibt, so dass y = conc(u, conc(x, v)) gilt. a) Realisieren Sie die Funktionen istAnfang und istTeilFolge für Zeichenfolgen entsprechend den aus der Vorlesung bekannten Funktionen für Sequenzen ganzer Zahlen. b) u heißt Vorfolge von x in y, falls es eine Zeichenfolge v gibt, so dass y = conc(u, conc(x, v)) gilt und x in conc(u, x) nur ein einziges Mal Teilfolge ist. Definieren Sie eine Java-Funktion vorfolge(x,y), die zu x und y die Vorfolge von x in y ausgibt. Falls x nicht Teilfolge von y ist, sei der Funktionswert undefiniert. c) Definieren Sie eine weitere Java-Funktion lsub(y,x) (Linkssubtraktion), die für (y, x) genau dann definiert ist, falls x die Anfangsfolge von y ist, und für die y = conc(x, lsub(y, x)) gilt. d) Programmieren Sie eine Java-Funktion ersetze(x,y,z), die die erste Teilfolge x von y durch z ersetzt und ansonsten y unverändert läßt. Stützen Sie sich dabei auf die in den vorangegangenen Teilaufgaben definierten Hilfsfunktionen ab. Realisieren Sie eine neue Klasse MeineZeichenFolge, welche die Klasse ZeichenFolge um die Operation ersetze und alle benötigten Hilfsfunktionen (Teilaufgaben a) bis c)) erweitert. e) Schreiben Sie eine Klasse TestMeineZeichenfolge, die Ihnen als Umgebung zum Testen Ihrer Funktion ersetze dient. Hinweis: Im WWW steht Ihnen unter http://www1/static/lehrstuhl/teaching/timeline-wt1011/ 365-grundlagen-der-programmierung-uebung-wise11 die Datei ZeichenFolge.java bereit, die alle in der Aufgabe genannten Schnittstellenoperationen enthält. Ferner umfasst diese Klasse noch die Operation toString, die es ermöglicht Zeichenfolgen mit Hilfe der System.out.println-Methode auszugeben, sowie eine Operation parseString, die Strings in Zeichenfolgen umwandelt.