Übungen Informatik I JAVA - http://www.fbi-lkt.fh-karlsruhe.de/lab/info01/tutorial Übungen Informatik 1 Folie 1
Inhalt Allgemeines Fakultät Fibonacci Türme von Hanoi Übungen Informatik 1 Folie 2
Ein Objekt heißt rekursiv, wenn es sich selbst als Teil enthält. ist ein alltägliches Phänomen: - Rückkopplung Mikrofon/Lautsprecher - Blick mit einem Spiegel in den Spiegel Übungen Informatik 1 Folie 3
Beispiel: Eine kleine Wunsch-Funktion Auf dem Weg durch den Wald begegnet uns eine Fee. Sie spricht zu uns:»du hast drei Wünsche frei«. static void fee() { wunsch(); wunsch(); fee(); } Durch den dauernden Aufruf der fee()-funktion haben wir unendlich viele Wünsche frei. ist also das Aufrufen der eigenen Methode, in der wir uns befinden. direkte Dies kann auch über einen Umweg funktionieren. indirekte. Übungen Informatik 1 Folie 4
Abbruchbedingung einer Eine Endlos-: static void runter( int n ) { System.out.print( n + ", " ); runter( n - 1 ); } Aufruf von runter(10) folgende Ausgabe: 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2,... ist prinzipiell etwas Unendliches. Abhilfe: 1. Abbruchbedingung wie bei Schleifen 2. und dann keinen saufruf mehr starten. Die Abbruchbedingung einer static void runter( int n ) { if ( n == 0 ) // sende return; System.out.print( n + ", " ); runter( n - 1 ); } Die runter()-methode ruft jetzt nur noch so lange runter(n-1) auf, wie n ungleich Null ist. Übungen Informatik 1 Folie 5
Unterschiedliche sformen en, bei denen hinter dem Methodenaufruf keine Anweisungen stehen heißen Endrekursion. static void runter1( int n ){ if ( n == 0 ) // sende return; System.out.print( n + ", " ); runter1( n - 1 ); } Ausgabe von runter1(10) 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 en, bei denen hinter dem Methodenaufruf Anweisungen stehen (schwieriger zu verstehen): static void runter2( int n ){ if ( n == 0 ) // sende return; runter2( n - 1 ); System.out.print( n + ", " ); } runter1() gibt zuerst die Zahl n aus und ruft anschließend rekursiv runter1() auf. runter2() steigt jedoch erst immer tiefer ab, und die muß beendet sein, bis es zum ersten print() kommt. Ausgabe von runter2(10) 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, Der Trick bei der Sache ist nun darin zu sehen, dass jede Methode ihre eigene lokale Variable besitzt. Übungen Informatik 1 Folie 6
Ausblick Ausblick Der niederländische Maler Maurits Cornelis Escher (1898-1972) machte die auch in Bildern berühmt. Seiten mit Bildern und Vita finden sich zum Beispiel unter folgenden Webadressen: http://www.worldofescher.com/ http://www.etropolis.com/escher/ http://www.iproject.com/escher/escher100.html Übungen Informatik 1 Folie 7
Fakultät Als Fakultät einer Zahl n bezeichnet man das Produkt aller Zahlen von 1 bis n. Schriftlich kennzeichnet man eine Fakultät, indem man ein Ausrufezeichen hinter die Zahl schreibt: 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720 Wieviele Möglichkeiten gibt es für eine sechsköpfige Familie an einem Esstisch mit sechs Stühlen Platz zu nehmen? Wie ist es, wenn ein Gast dazukommt? Übungen Informatik 1 Folie 8
Fibonacci-Reihe Fibonnacci war ein berühmter Mathematiker des 12. Jahhrhunderts. Er führte u.a. die indische Ziffernschreibweise (die arabische Zahlen) in Europa ein. Fibonacci entwickelte auch eine spezielle Zahlenreihe 1, 1, 2, 3, 5, 8, 13,..., die nach dem folgenden Vorschrift generiert wird: - Die beiden ersten Zahlen sind "1" - die nachfolgenden sind die Summe der zwei jeweils vorangehenden. Fibonacci-Reihe n F(n) 0 1 2 3 4 5 6 7 0 1 1 2 3 5 8 13 Übungen Informatik 1 Folie 9
Fibonacci-Reihe Diese Zahlenreihe hat in der Natur eine große Bedeutung: Kaninchenzucht Die Zucht beginnt mit einem jungen Kaninchenweibchen. Wie lange dauert es, bis sie sich auf 300 Weibchen vermehrt haben? Annahmen: - bis zur Geschlechtsreife dauert es 6 Wochen - die Tragzeit beträgt 6 Wochen - pro Wurf wird ein Weibchen geboren - es sterben keine Kaninchen Die Fibonacci-Reihe beschreibt die Anzahl Weibchen im 6 Wochen Abstand. Goldener Schnitt ist das Zahlenverhältnis (1 + Wurzel(5))/2, ca. 1.618. Das Verhältnis zweier aufeinanderfolgender Fibonacci-Zahlen nähert sich immer mehr dem Goldenen Schnitt. Übungen Informatik 1 Folie 10
Fibonacci-Reihe sbaum zu der Fibonaccifolge: n F(n) 0 1 2 3 4 5 6 7 0 1 1 2 3 5 8 13 Rekusionstiefe von fibo(n)=n Zahl der Rekursiven Aufrufe wächst exponentiell (~ Türme von Hanoi) hier: mehrfach-berechnung derselben Teilproblemen: unbedingt vermeiden! Fibonacci iterativ berechnen!! Übungen Informatik 1 Folie 11
Beispiel für Türme von Hanoi n Scheiben mit abnehmender Größe liegen auf dem Startort A. Sie sollen in derselben Reihenfolge auf Zielort B zu liegen kommen. Die Regeln für den Transport lauten: 1.) Jede Scheibe muss einzeln transportiert werden. 2.) Es darf nie eine größere Scheibe auf einer kleineren liegen. 3.) Es darf ein Hilfsort B zum Zwischenlagern verwendet werden. Die Ausgabe soll die einzelnen Züge dokumentieren und den Algorithmus veranschaulichen. Übungen Informatik 1 Folie 12
Wann? - wenn das Problem rekursiv definiert ist - Aufwand bei rek. Aufrufen wird durch sbaum (Aufrufb.) bestimmt: - stiefe möglichst klein: Höhe des sbaumes + 1 (max. Größe des Run-Time-Stacks, Größe des benötigten Speicherbedarfs) - Laufzeit möglichst klein: Gesamtzahl der Knoten im sbaum (= Anzahl aller rekursiven Aufrufe) Klassische Beispiele für in mathem. Definitionen: Binäre Bäume Fakultät GGT nach Euklid: stiefe = 1+2log (max{n,m}) akzeptabel sbaum ist eine Liste Hinweis auf iterativen Algorithmus Fibonacci-Zahlen: Rekusionstiefe von fibo(n)=n Zahl der Rekursiven Aufrufe wächst exponentiell (~ Türme von Hanoi) Türme von Hanoi Ackermann Funktion Für große Zahlen übersteigt die Funktion schnell alle Berechnungsmöglichkeiten. Ulams Funktion Übungen Informatik 1 Folie 13
Quellen Linkliste für weitere Informationen: http://autolisp.mapcar.net/rekursion.html) http://www.galileocomputing.de/openbook/javainsel3/ javainsel_020007.htm#rxxxjava020007588rekursivefunktionen Übungen Informatik 1 Folie 14