assignments/Assignment_009/readme.md

4.6 KiB
Raw Blame History

Was hoppelt den da?

🎓 Benotetes Assignment 🎓

📆 Fällig: 19.05.2026 📆

Nachdem Sie den Reptiloiden "Never gonna give you up" vorgesungen haben und ein Bild von Rick Astley entgegengehalten, sind diese wie zu Stein erstarrt und Sie können aus der Höhle flüchten. Hinter sich hören Sie noch das Grunzen und Schreien der Echsenwesen und glauben auch die Stimme von Mark Zuckerberg zu vernehmen. Nie wieder Facebook, Instagram und WhatsApp das war einfach zu viel. In Zukunft holen Sie sich Ihren Dopamin-Kick nur noch bei TikTok.

Geschafft! Sie sind an der Erdoberfläche angekommen und schlagen sich nach Hause durch. Die Reise dauert durchaus eine Weile, auch wegen der ständig verspäteten Züge. Als Sie ankommen, brauchen Sie erst einmal etwas Urlaub und Entspannung.

Also buchen Sie einen schönen Urlaub in den Alpen. Von Ihrem Zimmer haben Sie einen wunderbaren Blick auf die Wiesen und natürlich die Berge. Das einzige Problem: Es gibt kein Internet und damit entfallen die ganzen schönen Online-Spiele und das Netflixen komplett. Sie tun also das, was man in solch einer Situation macht, und schauen aus dem Fenster.

Sie sehen ein Kaninchen, das freudig über die Wiese hoppelt. "Ach, wie schön die Natur ist", denken Sie und seufzen entspannt.

Während Sie so den Kaninchen zuschauen, denken Sie an Fibonacci und den Biologieunterricht in der Schule. Dort haben Sie gelernt, dass die Größe einer Kaninchenpopulation solange man keine davon erlegt und isst (lecker) der Folge der Fibonacci-Zahlen folgt. Da sowieso nichts zu tun ist, setzen Sie sich in und programmieren ein entsprechendes, kleines Programm.

Die Fibonacci-Zahlen sind rekursiv definiert als:

  1. F_0 = 0
  2. F_1 = 1
  3. F_n = F_{n-1} + F_{n-2}

Damit ist der Anfang der Fibonacci-Folge:

n 0 1 2 3 4 5 6 7 8 9
F_n 0 1 1 2 3 5 8 13 21 34

Fibonacci-Berechnung

Gehen Sie in das Paket pr2.exceptions.fibonacci, in welchem eine Berechnung der Fibonacci-Zahlen durchgeführt wird.

Das Interface FibBerechner für die Fibonacci-Berchnung ist bereits gegeben.

Fehler, die bei der Berechnung von Fibonacci-Zahlen auftreten, müssen über Subklassen der Ausnahme FibException signalisiert werden. Welche Sie hier brauchen, können Sie über die Javadoc des Interfaces erfahren. Sie müssen die Ausnahmen den Methoden des Interfaces hizufügen.

Rekursive Berechnung

Implementieren Sie das Interface mit einer entsprechenden Klasse FibBerechnerRekursiv. Verwenden Sie zur Berechnung der Fibonacci-Zahlen einen rekursiven Algorithmus und widerstehen Sie der Versuchung, die Berechnung zu optimieren.

Diese Klasse ist nicht public und Instanzen können nur über die Factory erzeugt werden.

Iterative Berechnung

Analog zur rekursiven Berechnung, schreiben Sie eine weitere Klasse FibBerechnerIterativ, welche einen iterativen Algorithmus zur Bestimmung verwendet.

Diese Klasse ist nicht public und Instanzen können nur über die Factory erzeugt werden.

Verwendung einer Tabelle

Optimieren Sie die Implementierung weiter, indem Sie eine Klasse FibBerechnerTabelle schreiben, welche die Zahlen gar nicht mehr berechnet, sondern eine Tabelle verwendet, welche die korrekten Zahlen enthält.

Diese Klasse ist nicht public und Instanzen können nur über die Factory erzeugt werden.

Factory

Schreiben Sie eine Factory-Klasse FibBerechnerFactory mit deren Hilfe man eine Instanz einer Implementierung von FibBerechner erzeugen kann. Verbergen Sie die konkrete Implementierung vor dem Verwender und stellen Sie sicher, dass er nur das Interface verwenden kann. Zur Auswahl der Implementierung wird eine Enumeration verwendet. Schauen Sie sich die vorgegebene Klasse genau an.

Test

Schreiben Sie automatisierte JUnit-Tests im Paket pr2.exceptions.fibonacci.test, welche alle drei Implementierungen testen. Provozieren Sie auch alle denkbaren Fehler der Methoden und überprüfen Sie, ob die richtigen Ausnahmen geworfen werden.

Benchmark

Schreiben Sie eine Klasse Benchmark, welche die Perfomance der drei Implementierungen mit den in dem folgenden Array enthaltenen Zahlen: { 5, 6, 7, 8, 9, 30, 35, 38, 38, 38 } testet.

Welche Implementierung ist am schnellsten?

Tipp: Denken Sie daran, keinen Code zu duplizieren und führen Sie gegebenenfalls weitere Klasse ein, um dies zu vermeiden. Erinnern Sie sich an das Template-Method-Pattern aus der Vorlesung.