03.06.2014 Aufrufe

¨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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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?, =, >, =,

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!