Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

Javakurs/Übungsaufgaben/Rekursion vs. Iteration: Unterschied zwischen den Versionen

(Benchmark und Auswertung)
Zeile 44: Zeile 44:
 
Schreibt nun ein letztes kurzes Programm, das zuerst die Folgenglieder 5, 10, 15, 20, 30 und 40 iterativ und dann noch einmal rekursiv berechnet und sofort auf der Console ausdruckt.
 
Schreibt nun ein letztes kurzes Programm, das zuerst die Folgenglieder 5, 10, 15, 20, 30 und 40 iterativ und dann noch einmal rekursiv berechnet und sofort auf der Console ausdruckt.
  
Diskutiert die Geschwindigkeitsunterschiede und die mögliche Vorteile der iterativen Implementation mit einem Tutor.
+
Diskutiert die Geschwindigkeitsunterschiede und die möglichen Vorteile der iterativen Implementation mit einem Tutor.
  
 
Tipp: Sollte Euer iteratives Programm nicht binnen weniger Sekunden sämtliche Zahlen berechnet haben, lasst unbedingt einen Tutor kurz drüberschauen.
 
Tipp: Sollte Euer iteratives Programm nicht binnen weniger Sekunden sämtliche Zahlen berechnet haben, lasst unbedingt einen Tutor kurz drüberschauen.

Version vom 6. April 2007, 18:09 Uhr

Under Construction. Build by Georg.

Das Ziel dieser Aufgabe ist es, dass Ihr möglichst viele Eurer bisher erworbenen Java-Kenntnisse Schritt für Schritt anwendet. Abschließend sollt Ihr noch einen kleinen Benchmark einer rekrusiv und iterativ implementierten Funktion durchführen.

Funktionsweise Ermitteln & Verhübschen

Gegeben ist folgendes kleines Programm:

'''Quelltext hier einfügen'''

Offensichtlich ist hier programmiertechnisch Einiges schief gegangen. Denn obwohl der Code richtig funktioniert, ist er nur schwer leserlich. Folgende Fehler wurden gemacht:

  • nichtssagende Bennung der Variablen und Methoden
  • keine Kommentare
  • übertrieben Auslagerung in Extra-Methoden

All das sollt Ihr jetzt schrittweise ändern:

  1. Versucht, ohne den PC mit einigen Handsimulationen herauszufinden, was das Programm eigentlich berechnet
    • Hinweis: Beginnt mit kleinen Zahlen wie 0,1,2 oder 3 und macht mehrere Durchgänge.
    • Tipp: Es wird stets das n-te Glied einer bekannten Zahlenfolge berechnet.
  2. Integriert zuerst die beiden Hilfsfunktionen getSomeSmartInt und calcSomethingNice in die Hauptfunktion, da beide ziemlich überflüssig sind.
  3. Löst die verschachtelte Rekursion von doSomethingClever und theSmartest... auf.
  4. Lasst Euch "sprechende" Namen sowohl für die Variablen, Methode(n) und als auch die Klasse einfallen.
  5. Fügt ausreichend viele und prägnante Kommentare hinzu, bis das Programm für Euch gut lesbar ist.
  6. WICHTIG: Holt Euch nun einen Tutor ran, zeigt ihm Euer Programm und diskutiert die Lesbarkeit des Codes. Er kann euch sicherlich nützliche Tipps geben, was Ihr in Zukunft beim Programmieren unbedingt beachten solltet.


Eine Iterative Alternative

Schreibt nun ein Programm, dass die gleiche Zahlenreihe nicht-rekursiv berechnet. Verwendet dazu ein Array von Integern und folgende Idee:

  • Initialisiert ein Array, das alle Folgenglieder (bei 0 anfangend) bis zum Gesuchten aufnehmen kann.
  • Berechnet die Folgenglieder in einer Schleife Eurer Wahl aufsteigend bei 0 beginnend und speichert sie in dem Array wie folgt: Folgenglied 0 steht an Position 0 im Array, Folgenglied 1 steht an Position 1 im Array, usw.

Hinweis: Wenn Ihr mit der Programmidee oder der Implementation Probleme habt, zögert nicht, einen Tutor zu fragen.


Benchmark und Auswertung

Schreibt nun ein letztes kurzes Programm, das zuerst die Folgenglieder 5, 10, 15, 20, 30 und 40 iterativ und dann noch einmal rekursiv berechnet und sofort auf der Console ausdruckt.

Diskutiert die Geschwindigkeitsunterschiede und die möglichen Vorteile der iterativen Implementation mit einem Tutor.

Tipp: Sollte Euer iteratives Programm nicht binnen weniger Sekunden sämtliche Zahlen berechnet haben, lasst unbedingt einen Tutor kurz drüberschauen.