¨Ubungsblatt 3 vom 4.11.2011 Aufgabe 1 (4 Punkte) - Fachgebiet ...
¨Ubungsblatt 3 vom 4.11.2011 Aufgabe 1 (4 Punkte) - Fachgebiet ...
¨Ubungsblatt 3 vom 4.11.2011 Aufgabe 1 (4 Punkte) - Fachgebiet ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Institut für Praktische Informatik<br />
<strong>Fachgebiet</strong> Programmiersprachen und Übersetzer<br />
Prof. Dr. Rainer Parchmann<br />
Programmieren (Scheme) - WS 2009/10<br />
Übungsblatt 3 <strong>vom</strong> <strong>4.11.2011</strong><br />
Abgabe der Lösungen am 11.11.2011 bis 09:15 Uhr<br />
<strong>Aufgabe</strong> 1<br />
(4 <strong>Punkte</strong>)<br />
Ein für die Untersuchung zweier Zeichenketten auf Ähnlichkeiten wichtiger Begriff ist der ihrer Ausrichtungen,<br />
in der Bioinformatik auch Sequenz-Alignments genannt. Eine Ausrichtung zweier Zeichenketten<br />
a, b ist wiederum ein Paar von Zeichenketten a’, b’, die durch das Einfügen neutraler Zeichen (-)<br />
gestreckt wurden. Dabei müssen a’ und b’ gleich lang sein und dürfen nicht an der gleichen Stelle ein<br />
neutrales Zeichen enthalten.<br />
Beispiele für a = PROZEDUR und b = REKURSIV:<br />
a’ = PROZEDUR--- a’ = --PRO-ZE-DUR<br />
b’ = -R--EKURSIV b’ = REK-URSIV---<br />
Aber auch:<br />
a’ = PROZEDUR a’ = --------PROZEDUR<br />
b’ = REKURSIV b’ = REKURSIV--------<br />
Wie man sieht, kann man im letzten Beispiel keine weiteren Zeichen einfügen, ohne die zweite oben<br />
genannte Regel zu verletzen. Die Anzahl der Ausrichtungen zweier Zeichenketten ist eine endliche Größe,<br />
die nun in Abhängigkeit der Länge der beiden Zeichenketten berechnet werden soll.<br />
Man kann dazu folgende rekursive Formel konstruieren, wobei m und n die Längen der Zeichenketten<br />
und f(m, n) die gesuchte Anzahl der Ausrichtungen seien:<br />
{ 1 falls m = 0 oder n = 0<br />
f(m, n) :=<br />
f(m − 1, n) + f(m − 1, n − 1) + f(m, n − 1)<br />
sonst<br />
Implementieren Sie die Prozedur (alignments m n), die die Anzahl der Ausrichtungen nach dieser Methode<br />
berechnet.<br />
(alignments 5 9) --> 22363<br />
Welchen Prozess beschreibt diese Funktion? Was zeichnet diesen Prozesstypen aus?<br />
Es existiert allerdings auch die folgenden beiden Formeln zur Berechnung von f:<br />
f(m, n) =<br />
=<br />
m+n<br />
∑<br />
l=max{m,n}<br />
m+n<br />
∑<br />
l=max{m,n}<br />
l!<br />
(l − m)!(l − n)!(m + n − l)!<br />
( ) ( )<br />
l n<br />
·<br />
l − n l − m<br />
(1)<br />
(2)<br />
Implementieren Sie Formel (1) in einer Prozedur (alignments-fac m n) und Formel (2) in einer Prozedur<br />
(alignments-binom m n). Beide Prozeduren sollen einen iterativen Prozess erzeugen. Verwenden<br />
Sie für hierfür die aus der Übung bekannten Prozeduren für Fakultät und Binomialkoeffizient. Verwenden<br />
Sie lokale Hilfsprozeduren, wo es sinnvoll erscheint.<br />
(alignments-fac 50 90) --> 8041316950496409391577164244714439684895916569565<br />
Seite 1
<strong>Aufgabe</strong> 2<br />
(3 <strong>Punkte</strong>)<br />
Eine Funktion f : N → Z sei definiert durch<br />
{ 1 für n < 3<br />
f(n) :=<br />
2f(n − 1) + f(n − 2) − 3f(n − 3) sonst<br />
Schreiben Sie zwei Prozeduren, von denen die eine f in einem rekursiven, die andere f in einem iterativen<br />
Prozess berechnet. Benutzen Sie dabei lokale Hilfsprozeduren, falls notwendig.<br />
(f 10) --> -176<br />
Welchen Unterschied gibt es zwischen den beiden Prozessen in Hinsicht auf die Laufzeit?<br />
Geben Sie das Ergebnis von f(100) mit Hilfe der iterativen Implementierung an. Berechnen Sie anschließend<br />
die theoretische Laufzeit des rekursiven Prozesses für diesen Aufruf, indem Sie den Proportionalitätsfaktor<br />
nach der Methode der Übung berechnen. Benutzen Sie als Basis 1.84.<br />
Können Sie sich erklären, dass die reale Laufzeit der iterativen Version in Abhängigkeit ihres Arguments<br />
stärker als linear wächst?<br />
<strong>Aufgabe</strong> 3<br />
(5 <strong>Punkte</strong>)<br />
In der Vorlesung wurde die folgende Scheme-Prozedur zur Potenzierung vorgestellt:<br />
(define (fast-exp b n)<br />
(cond ((= n 0) 1)<br />
((even? n) (square (fast-exp b (/ n 2))))<br />
(else (* b (fast-exp b (- n 1))))))<br />
(a) Konstruieren Sie eine neue Scheme-Prozedur fast-exp-i für einen iterativen Potenzierungsprozess,<br />
die wie fast-exp sukzessive Quadratbildung bzw. Multiplikation mit b verwendet und dafür nur<br />
O(log n) Rechenschritte (also rekursive Funktionsaufrufe) benötigt. Schreiben Sie unter Verwendung<br />
von check-expect mindestens drei Testfälle.<br />
Hinweis: Beachten Sie, dass (b n/2 ) 2 = (b 2 ) n/2 gilt. Implementieren Sie eine (lokale) Prozedur<br />
exp-iter mit drei Formalparametern a, b und n und definieren Sie die Zustandsübergänge so,<br />
dass das Produkt ab n von Zustand zu Zustand unverändert bleibt.<br />
(b) Erklären Sie, wie es zur oben genannten Laufzeitkomplexität von fast-exp-i kommt.<br />
Bemerkungen<br />
• Die check-expect Prozedur wird bereits durch DrRacket bereitgestellt. Um Sie zu verwenden<br />
fügen Sie am Anfang Ihres Quelltestes den Aufruf (require test-engine/racket-tests) ein.<br />
Nach dem letzen Aufruf von check-expect fügen Sie dann (test) ein um die Ergebnisse Ihrer<br />
Tests zu erhalten.<br />
• Verwenden Sie bei der Lösung der <strong>Aufgabe</strong>n nur die folgenden Befehle und Operationen: +, -, *,<br />
/, quotient, remainder, even?, odd?, =, >, =,