Fachrichtung 6.2 — Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Blatt 1 (Rekursive Prozeduren) Hinweis: Dieses Übungsblatt enthält von den Tutoren für das Wiederholungstutorium erstellte Aufgaben. Die Aufgaben und die damit abgedeckten Themenbereiche sind für die Klausur weder relevant noch irrelevant. Schnellkurs Aufgabe 1.1 (Grundbegriffe) Identifizieren Sie Bezeichner, Schlüsselwörter, Operatoren und Konstanten in folgendem Programm: fun p x = x=0 val x = if ( p 3) then ∼1 else 3−2 Aufgabe 1.2 (Swap Swap) Schreiben Sie eine Prozedur swap: int * int * int → int * int * int, die ein Tripel aus Zahlen erhält und diese rotierend tauscht. Zum Beispiel soll swap(1,2,3) = (3,1,2) liefern. Schreiben Sie die Prozedur auf drei Arten. (a) Mit Projektion. (b) Mit lokaler Deklaration (let-Ausdruck). (c) Mit kartesischem Argumentmuster. Aufgabe 1.3 (Minimum) Schreiben Sie eine Prozedur min: int → int → int → int, die zu drei Zahlen die kleinste liefert, auf zwei Arten: (a) Benutzen Sie keine Hilfsprozedur und drei Konditionale. (b) Benutzen Sie eine Hilfsprozedur und insgesamt ein Konditional. Aufgabe 1.4 (Endrekursion) Diskutieren Sie mit einem Partner über den Unterschied zwischen Rekursion und Endrekursion. Welchen Vorteil hat Endrekursion? Betrachten Sie jetzt folgende Prozedur: fun foo (a , b ) = if a=0 then b else foo ( a−1 , b+1) (a) Ist foo endrekursiv? (b) Geben Sie die Rekursionsfolge für den Aufruf foo(3,0) an. (c) Geben Sie ein vollständiges Ausführungsprotokoll für den Aufruf foo(3,0) an. Das Auführungsprotokoll umfasst 18 Ausführungsschritte. 1 Rekursive Prozeduren schreiben Aufgabe 1.5 (ganzzahlige Division) Schreiben Sie zwei Prozeduren des Typs int → int → int, die das Ergebnis ganzzahliger Division m div n (n 6= 0) durch wiederholte Subtraktion berechnen: (a) Wobei m, n nicht negativ sind. (b) Wobei m, n ganzzahlig sind. Hinweis: Benutzen Sie bei (b) eine Hilfsprozedur, die das Vorzeichen des Ergebnisses festlegt. Verwenden Sie die in (a) verwendete Prozedur, um das Ergebnis zu bestimmen. Aufgabe 1.6 (Quersumme) Schreiben Sie eine Prozedur quer: int → int, die die Quersumme einer nicht negativen Zahl berechnet. Aufgabe 1.7 (Stelligkeit) Schreiben Sie eine Prozedur stell: int → int, die die Stelligkeit einer nicht negativen Zahl berechnet. Zum Beispiel liefert stell(162) = 3. Aufgabe 1.8 (Von Ziffern und Zahlen) Schreiben Sie eine Prozedur increase: int → int, die eine gegebene nicht negative Zahl in jeder Ziffer um eins erhöht. Dabei soll die Ziffer 9 zu einer 0 erhöht werden und gleichzeitig die Ziffer, die links der 9 steht im nächsten Schritt um zwei erhöht werden. Zum Beispiel liefert increase(190) = 301. Aufgabe 1.9 Schreiben Sie die jeweiligen Prozeduren mit normaler Rekursion und mit Endrekursion. (a) Die Prozedur add: int * int → int soll die Summe zweier nicht negativer Zahlen durch Inkrementierung berechnen. (b) Die Prozedur mul: int * int → int soll das Produkt zweier nicht negativer Zahlen durch wiederholte Addition berechnen. (c) Die Prozedur pow: int * int → int soll die Potenz zweier nicht negativer Zahlen durch wiederholte Multiplikation berechnen. Hinweis: Sie dürfen für die endrekursive Lösung von mul und pow eine endrekursive Hilfsprozedur verwenden. Aufgabe 1.10 (Reversion) Schreiben Sie eine Prozedur rev: int → int, die eine nicht negative Zahl reversiert. Hinweis: Verwenden Sie dazu eine endrekursive Hilfsprozedur. Aufgabe 1.11 (Natürliche Quadratwurzel) Schreiben Sie eine Prozedur sqr: int → int, die die natürliche Quadratwurzel einer nicht negativen Zahl berechnet. Hinweis: Verwenden Sie eine endrekursive Hilfsprozedur. Aufgabe 1.12 (Quadratzahlen) Schreiben Sie eine Prozedur sqr: int → int, die durch wiederholte Addition das Quadrat einer nicht negativen Zahl berechnet. Verwenden Sie dazu keine Hilfsprozedur. Hinweis: Es gilt für n > 0: 1 + 3 + ... + 2n − 1 = n2 2 Aufgabe 1.13 (Ziffernauftreten) Schreiben Sie eine Prozedur count: int → int → int, die die Anzahl an Auftreten einer Ziffer in einer Zahl berechnet. Zum Beispiel soll count 2 24212 = 3 liefern. Programmiersprachliches Aufgabe 1.14 (Baumdarstellung) Geben Sie die Baumdarstellung der folgenden durch Zeichendarstellungen beschriebenen Phrasen und Typen an. (a) int * int * int → bool * bool → int (b) if x<3 then 3 else p 3 (c) val x = let fun f (x:int,y:int) : int = ∼(x+y) in f(1,2) + 3 + f(4,5) end Aufgabe 1.15 (Prozeduren sind Werte) Geben Sie die Tripeldarstellung der Prozedur an, zu der der folgende Ausdruck auswertet: ( fn ( x : int ) ⇒ fn ( b : bool ) ⇒ if b then x else 5) (2*3) Aufgabe 1.16 (Bezeichnerbindung) Betrachten Sie das folgende Programm: val x = ∼2+7 fun f ( y : int ) = x+y fun g ( y : int ) : int = if y<x then 0 else y+g ( y−1) (a) Geben Sie die Umgebung an, die die Ausführung des Programms in der Umgebung [] liefert. (b) Geben Sie die Umgebung an, in der der Rumpf der Prozedur f bei der Ausführung des Aufrufs f 7 ausgeführt wird. (c) Geben Sie die Umgebung an, in der der Rumpf der Prozedur g bei der Ausführung des Aufrufs g 13 ausgeführt wird. Aufgabe 1.17 Welche Bindungen berechnet das folgende Programm? fun val fun val f x g x ( x : bool ) = if x then 1 else 0 = 5*7 ( z : int ) = f ( z<x )<x = g 5 3