Übungen zum Modul Algorithmen und Datenstrukturen im WS 2003/2004 Prof. Dr. W. Kowalk, Abteilung Rechnernetze, Department Informatik, Fakultät II, Universität Oldenburg Übungsblatt 9 9.1 Rekursive Berechnung mit 3AA (50 Punkte) Hinweise: In der Vorlesung wurden ein Stack als eine Datenstruktur eingeführt, welche Daten (Werte oder Adressen) aufnehmen kann und jeweils den zuletzt aufgenommenen Wert liefert. Durch Speichern von Rücksprungadressen im Stack lassen sich rekursive Prozeduren realisieren. Der Stack wird in den meisten Rechnerarchitekturen in der Hardware implementiert, um seine Benutzung einfacher und effizienter zu machen. In 3AA wird ein 'Systemstack' durch die Variable STACK eingeführt, hinter welcher der Stack beginnt (der Wert ist implizit gesetzt, lässt sich aber auch explizit setzen). Es werden die folgenden zusätzlichen Anweisungen eingeführt: jumpProc con ProzedurName// Schiebe Rücksprungadresse in STACK, springe zur Prozedur returnProc // springe zur Rücksprungadresse (im STACK),dekrementiere STACK get con 2, adr wert // hole Wert aus (STACKadresse – 2) put con 2, <ausdruck> // schreibe Wert des Ausdrucks am (STACKadresse – 2) push <ausdruck> // erhöhe STACK, schreibe Wert des Ausdrucks an (STACKadresse) pull <ausdruck> // erniedrige STACK um Wert des Ausdrucks. a) Implementieren Sie ein 3AA-Programm, welches die Summe der ersten N Zahlen rekursiv berechnet. In Pseudo(Java)-Notation soll der Algorithmus folgende Funktionalität implementieren: int sumN(n) { if(n<=0) return 0; return sumN(n-1)+n; } Begründen Sie informal, warum dieser Algorithmus nach einer endlichen Zeit terminiert. Ist die Laufzeitkomplexität linear in n? b) i. Implementieren Sie ein 3AA-Programm, welches die Fibonacci-Zahl zu einer Zahl rekursiv berechnet. In Pseudo-Notation soll der Algorithmus folgende Funktionalität implementieren: int fib(n) { if(n<=1) return 1; return fib(n-1)+fib(n-2); } ii. Beschreiben Sie informal, wie die Fibonacci-Zahlen definiert sind. iii.Versuchen Sie, anhand von Laufzeitmessungen die Laufzeitkomplexität abzuschätzen. Hinweis: Testen Sie diese Funktion zunächst mit kleinen Werten (<20). 9.2 Lineare Schleifen (50 Punkte) a) In der Vorlesung wurden Lineare Schleifen eingeführt. i. Die folgende Lineare Schleife 2. Grades berechnet die Folge der Fibonacci-Zahlen 1 2 3 4 NochMal 5 6 7 a 8 b // Lineare Schleifen, Fibonacci adr a := con 1 adr b := con 0 adr a := val a + val b adr b := val a - val b goto con NochMal Bestätigen Sie dieses anhand einiger Beispielrechnungen. ii. Beweisen Sie dieses induktiv, indem Sie zeigen: wenn a und b die Werte a=Fib(n-1) b=Fib(n-2) am Anfang der Schleife enthalten, dann enthält nach einem Schleifendurchlauf a=Fib(n) b=Fib(n-1). iii.Bestätigen Sie das allgemeine Wachstumsgesetz der Fibonaccizahlen k k 1 5 1 5 5−1⋅ 1− 5 . F k= ⋅ 2 2 2⋅ 5 2⋅ 5 indem Sie diesen Wert mit den aus dem Algorithmus bestimmten vergleichen. Eine Näherungsformel für Fib(N) ist: Fib(N) ≈ A * BN, wobei A ≈ 0.7236067977499789, B ≈ 1.618033988749895. Hinweis: verwenden Sie Gleitpunktzahlen: A con B con 0.7236067977499789 1.618033988749895 und rechnen Sie in jedem Schleifendurchlauf: adr A := val A *f val B iv. Welche Laufzeitkomplexität hat das Programm unter i. (bzw. iii.)? b) In der Vorlesung wurden Polynomschleifen eingeführt. Es wurde behauptet, dass diese stets eine Wertefolge annehmen, die einem Polynom entsprechenden Grades entsprechen Pk(n) = ak*nk + ak-1*nk-1 + ... + a1*n + a0. 1 2 3 4 5 NochMal 6 7 8 // Polynomschleifen für Polynom vom Grad 3 adr a := con -10 adr b := con 100 adr c := con 2 adr c := val c + val b adr b := val b + val a adr a := val a + con 1 goto con NochMal i. Bestimmen Sie die Anfangswerte im Algorithmus für ein Polynom vom Grad 3, dessen erste vier Werte (3, -3, 0, 4) sind. Wie groß ist das konstante Inkrement? Berechnen Sie die ersten zwanzig Werte. ii. Geben Sie einen mathematischen Beweis für das polynomiale Verhalten an. Hinweis: Zeigen Sie, dass P(n)-P(n-1) stets ein Polynom vom Grad k-1 ist. Hinweis: Sie können die Programme unter 9.2.a) und 9.2.b) auch in Java schreiben und abgeben! Hinweise: Die Übungen sind bis Freitag, 19.12.2003, 10.00 Uhr in den Kästen der jeweiligen Tutoren abzugeben.