# 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](../sources/src/main/java/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](../sources/src/main/java/pr2/exceptions/fibonacci/impl/FibBerechnerFactory.java) 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.