Übungsblatt aus Wiederholungstutorium 1

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