SFZ FN Sj. 13/14 Python 3 Rekursion Inf K1/2 Sj 13/14

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmentheorie 08 – Dynamische Programmierung (1)
Advertisements

Rekursion: Rekurrenz: Algorithmen rufen sich selbst (rekursiv) auf.
Falls Algorithmen sich selbst rekursiv aufrufen, so kann ihr Laufzeitverhalten bzw. ihr Speicherplatzbedarf in der Regel durch eine Rekursionsformel (recurrence,
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Polynomial Root Isolation
Simulation komplexer technischer Anlagen
Schnelle Matrizenoperationen von Christian Büttner
Vom graphischen Differenzieren
Sortieren I - Bubblesort -
Rekursion vs. Iteration
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Rekursionen Erstellt von J. Rudolf im November 2001 /
Kapitel 6. Suchverfahren
12. Iteration und Rekursion
Finale Semantik und beobachtbares Verhalten
Rekursion Was ist Rekursion? Was sind rekursive Methoden?
der Universität Oldenburg
Klicke Dich mit der linken Maustaste durch das Übungsprogramm!
REKURSION + ITERATION.
REKURSION + ITERATION. Bemerkung: Die in den folgenden Folien angegebenen "Herleitungen" sind keine exakten Beweise, sondern Plausibilitätsbetrachtungen.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Dynamische Programmierung (2) Matrixkettenprodukt
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Prof. Dr. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (02 – Funktionenklassen) Tobias Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
WS Algorithmentheorie 08 – Dynamische Programmierung (2) Matrixkettenprodukt Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Formeln umstellen Zum Umstellen einer Formel gelten die Rechenregeln von Gleichungen Im Folgenden ein Beispiel am Dreieck:
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Beispiele für Gleichungssysteme
V. Algebra und Geometrie
Zusammenfassung Vorwoche
Minimum Spanning Tree: MST
DVG Methoden 1 Methoden. 2 int dezi = Integer.parseInt(args[0]); boolean vz = (dezi>=0); dezi = Math.abs(dezi); String Bin = ""; do { } while.
Die Funktionsgleichung
Thema: Fibonacci-Zahlen
BIT – Schaßan – WS 02/03 Basisinformationstechnologie HK-Medien Teil 1, 11.Sitzung WS 02/03.
Hartmut Klauck Universität Frankfurt WS 06/
Polynome und schnelle Fourier-Transformation
Einführung in die Programmierung
Einführung in die Programmiersprache C 4
Bestimmen von Prozentwert, Grundwert und Prozentsatz
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger Institut.
2.4 Rekursion Klassifikation und Beispiele
PHP Basic.
Grundkonzepte des Programmierens (mit ActionScript)
Strategie der Modellbildung
Algorithmen und Datenstrukturen Übungsmodul 8
Variablen. var meineZahl:Number = 7; meineZahl 7 Name TypWert = Zuweisung von Variablen.
1 Albert-Ludwigs-Universität Freiburg Rechnernetze und Telematik Prof. Dr. Christian Schindelhauer Informatik III Christian Schindelhauer Wintersemester.
SFZ Sj 13/14 GZG FN W.Seyboldt 1 SFZ FN Sj. 13/14 Python Grundlagen.
SFZ FN Sj. 13/14 Python Grundlagen InfK12 Sj 13/14 GZG FN W.Seyboldt.
SFZ FN Sj. 13/14 Python 2 Turtle Inf K1/2 Sj 13/14 GZG FN W.Seyboldt.
Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 1 SFZ FN Sj. 13/14 Python Klassen und Objekte.
Vom graphischen Differenzieren
Pool Informatik 5 GZG FN Sj. 11/12
Subnetting.
Unterprogramme / Methoden
Pool Informatik, Sj 11/12 GZG FN W.Seyboldt 1 Pool Informatik 5 GZG FN Sj. 11/12 Kopieren, Daten, Programme.
Vorstellen und Herleiten der Horner Schemas
Funktionen. Aufgabe : Eingabe zweier Zahlen ---> Minimum bestimmen Dann nochmals Eingabe zweier Zahlen ---> Minimum bestimmen.
Dr. Wolfram Amme, Semantik funktionaler Programme, Informatik II, FSU Jena, SS Semantik funktionaler Programme.
J. Nürnberger2007 / 081 Tabellenkalkulation (3) Arbeiten mit Formeln am Beispiel von OpenOffice.org Calc.
1. Die rekursive Datenstruktur Liste 1.3 Rekursive Funktionen
REKURSION + ITERATION.
 Präsentation transkript:

SFZ FN Sj. 13/14 Python 3 Rekursion Inf K1/2 Sj 13/14 GZG FN W.Seyboldt

Rekursion Prinzip der Rekursion: In einer Funktion wird die Funktion wieder aufgegriffen. Das darf allerdings nicht ohne Ende geschehen. Wikipedia: Das Grundprinzip der Rekursion ist das Zurückführen einer allgemeinen Aufgabe auf eine einfachere Aufgabe derselben Klasse. Das Grundprinzip der rekursiven Definition einer Funktion f ist: Der Funktionswert f(n+1) ergibt sich durch Verknüpfung bereits berechneter Werte f(n), f(n-1), ... f(1) wird allerdings auf andere Art bestimmt. Beispiel: Berechne n! Vorgehen: n! = n* (n-1)!. Das heißt, ich kann n! berechnen, wenn ich (n-1)! kenne. Es gilt 1!=1. fak01.py: Schreibe ein Programm mit der Methode fakrek(n), die n! rekursiv berechnet. Sie ruft fakrek(n-1) auf und multipliziert das Ergebnis von fakrek(n-1) mit n. Dieses Ergebnis wird dann zurückgegeben. Ist n==1: return 1. Bestimme die ersten 100 Glieder von der Folge (n!) Siehe auch http://www.python-kurs.eu/rekursive_funktionen.php Lit http://www.mi.uni-koeln.de/c/mirror/f7alpha1.informatik.fh-muenchen.de/~schieder/programmieren-2-ss97/recursion.html GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Rechenzeit Rekursionen sind langsam und erfordern vom PC viel Aufwand. Wir wollen nun die Rechenzeit bestimmen, die man benötigt, um alle Fakultäten rekursiv von 1 bis 500 zu bestimmen. Ergänze fak01 und speichere es als fak01a.py um die benötigten Befehle. from time import time startzeit = time() … Rechnung … endzeit = time() print "Benötigte Rechenzeit = %8.6f s" %(endzeit-startzeit) GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Iteration statt Rekursion Wie kann man die Probleme von rekursiven Methoden lösen? Oft kann man Rekursionen durch Schleifen ersetzen Oder man wendet das Prinzip der Rekursion mit Generatoren an fak02.py: Schreibe ein Programm, das die Fakultät in Form einer Schleife berechnet Nenne die Methode fakiter(n) Das Programm soll die Methode weiterhin fakrek enthalten und die Rechenzeiten vergleichen. Ergebnis: Die Rechenzeiten unterscheiden sich recht wenig. Das ist nicht immer so. Auf der nächsten Folie schauen wir uns ein komplexeres Problem an. GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Fibonacci-Folge, fib01,py Die Fibonacci-Folge: Die Fibonacci-Folge ist rekursiv definiert: fib(n)=fIb(n-1)+fib(n-2) und fib(1)=fib(2)=1. Die Fibonacci-Zahlen resultieren aus einem "künstlichen" Kaninchenproblem, das die folgenden Bedingungen erfüllt: Die Anfangspopulation wird von einem Kaninchenpaar gebildet Ein neugeborenes Kaninchenpaar kann sich erst am Ende des ersten Monats paaren und wirft am Ende des zweiten Monates ein weiteres Paar. Ansonsten wirft jedes Kaninchenpaar jeweils ein weiteres Kaninchenpaar pro Monat. Sie sind unsterblich Aufgabe fib01.py : Schreibe eine Methode fibr1(), die die Fibonacci-Folge rekursiv berechnet. Bestimme die ersten 30 Glieder derFibonacci-Folge Bestimme die Rechenzeit. GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Probleme der Rekursion Warum dauert das Programm so lange? Wenn man z.B. fib(6) berechnet, sieht der Aufrufbaum wie folgt aus: fib(2) wird also 5 mal aufgerufen. Wie lässt sich dies verbessern? Ein iterative Lösung findet sich nicht (so leicht). Was geht dann? Python bietet zwei Verfahren Siehe https://www.fbi.h-da.de/fileadmin/personal/n.spangler/informatik_2/cpp_kap16.pdf GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Verbesserung 1: fib02.py Jedes Mal wenn wir ein Folgenglied berechnet haben, speichern wir den Wert in einer Liste namens fibMem ab. Siehe fib02.py Aufgabe: Schreibe das Programm selbst Nenne die entsprechende Methode fibr2() Messe die Rechenzeit für fibr2() Ergebnis: Wenn wir fibr1(35) aufrufen, benötigt das Programm knapp 9 s Wenn wir fibr2(999) aufrufen, erhalten wir die Antwort fast sofort Aber Vorsicht: Auch bei dieser Variante, kann die Iterationstiefe überschritten werden. Quelle http://en.literateprograms.org/Fibonacci_numbers_%28Python%29 GZG FN W.Seyboldt Inf K1/2 Sj 13/14

fibr2() - Vorschlag fibMem=[0,1,1] # fibr2(0)..fibr2(2) # Dies ist die globale Liste, die fib02 verwendet. def fibr2(n): # überprüfe zuerst, ob fib(n) schon berechnet wurde if n<len(fibMem): return fibMem[n] # den noch nie berechneten Wert rekrusiv # berechen und abspeichern fn=fibr2(n-1)+fibr2(n-2) fibMem.append(fn) return fn GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Generator (yield) Teil 1 Python bietet noch ein Verfahren an, das noch geschickter ist, wenn es auch keinesfalls einfach zu verstehen ist. Ein Generator gen() ist eine Methode, die bei jedem Aufruf das nächste Element einer virtuellen Sequenz mit yield statt return zurückgibt, die sozusagen einen Wert der Folge nach dem anderen produziert bzw. abwirft (englisch: yield, abwerfen, einbringen). Gestartet wird mit g=gen() Jeder Aufruf des Generators mit g.next() ergibt das nächste Folgenelement. Definition einer Generators define fibo_generator(): setze Startwerte loop berechne das nächste Folgenelement yield Folgenelement end loop Anwenden eines Generators fibo = fibo_generator() for n = 1 to 20: print fibo.next() Lies http://www.python-kurs.eu/generatoren.php Erstelle das dort beschriebene Programm, speichere es in generator01.py Quelle http://openbook.galileocomputing.de/python/python_kapitel_13_004.htm Quelle http://www.python-kurs.eu/generatoren.php GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Generator (yield) Teil 2 Der Generator kann dann in einer for-Schleife anstelle einer Liste verwendet werden. Aufgabe generator02.py : Erstelle einen Generator, der einfach die Quadratzahlen liefert. Nachdem der Generator mit …next() einige Male aufgerufen wurde, soll ein neuer Generator erzeugt werden. Was beobachtest Du? Aufgabe fib03.py: Erstelle ein Python-Programm, das mit einem Generator die Fibonacci-Zahlen zurückgibt. Damit wird übrigens kein Überlauf mehr produziert, da kein (großer) Stack erzeugt wird. GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Lösungsvorschlag fib03.py def fib3gen(): # Generator (enthält yield()) a=1 b=1 while 1: yield a c=a+b a,b=b,c def fib3r(n): fibo=fib3gen() for i in range(n+1): z=fibo.next() return z # jetzt wird der Geneator beendet n=5000 z= fib3r(n) print z GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Lösungsvorschlag fib04.py Da beim Abarbeiten einer Liste, jedesmal das nächste Element erzeugt wird, kann statt der Liste auch die Methode stehen, die ein yield enthält. Siehe http://www.python-kurs.eu/generatoren.php „Generatoren und ihre Arbeitsweise“ def fib04gen(): a,b=1,1 while True: yield a a, b = b, a + b def fib04(n): i=0 for z in fib04gen(): if i==n: return z i+=1 GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Ein komplexer Generator Lies http://www.python-kurs.eu/generatoren.php „Rekursiver Generator“ Erstelle perm01.py und teste den Code GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Pascalsches Dreieck Aufgabe: Schreibe ein Programm, das das Pascalsche Dreieck anzeigt: Die k. Zahl in der n. Zeile ist (n über k oder k aus n) Jede Zahl ist die Summe der beiden über ihr stehenden Zahlen. (Falls es keine zwei darüber stehenden gibt ist die Zahl 1) Es gilt auch: ist die Anzahl der Möglichkeiten k aus n Kugeln auszuwählen. Rekursiv: PascalschesDreieck01.py Generator: PascalschesDreieck02.py GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Die Kochsche Kurve: Kochkurve.py Wikipdeia: Die Koch-Kurve ist ein von dem schwedischen Mathematiker Helge von Koch 1904 vorgestelltes Beispiel für eine überall stetige, aber nirgends differenzierbare Kurve. Man kann die Kurve anschaulich mittels eines iterativen Prozesses konstruieren: Ersetze das mittlere Drittel einer jeden Teilstrecke durch die Spitze eines gleichseitigen Dreiecks. Quelle http://de.wikipedia.org/wiki/Koch-Kurve GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Wdh. turtle (a_dummy.py) import turtle as t def fkt(,,,s) return # Objekte erzeugen und initialisieren fenster = t.Screen() fenster.bgcolor('yellow') hugo = t.Turtle(shape="turtle") hugo.speed(9) # 0: am schnellsten, 10 schnell, 6 normal, 1 langsam hugo.color('blue') hugo.pensize(2) hugo.up() hugo.goto(0,0) hugo.down() fkt(,,,hugo) t.done() # Warten bis der Benutzer das Fenster schließt GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Aufgabe Kochkurve.py Zeichne mit der Turtle eine Kochkurve der Länge 600 Pixel, wobei die geraden gezeichneten Stücke mindestens die Länge ml haben sollen. Benutze dazu die Grundstruktur der letzten Folie. Rufe zeichneKoch(laenge, ml, s) rekursiv auf. Wenn laenge <3*ml soll eine Gerade gezeichnet werden Ansonsten soll die Länge gedrittelt werden und nach entsprechenden Richtungsänderungen sollen die Teilstücke rekursiv gezeichnet werden. GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Kochkurve.py def zeichneKoch(laenge, ml, s): if laenge<3*ml: # laenge = gesamte Länge der Kurve, # ml: Mindestlänge der geraden Teilstücke # s = turtle if laenge<3*ml: s.forward(l) else: tiefe-=1 laenge3=laenge/3 zeichneKoch(laenge3, ml, h) s.left(60) s.right(120) return GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Schneeflocke.py Zeichnet man ein gleichseitiges Dreieck und dann iterativ für jede Seite die Kochsche Kurve, erhält man eine Figur, die wie eine Schneeflocke aussieht. Die Länge der Randkurve wird mit jeder Iteration immer länger: Sie verlängert sich um den Faktor 4/3. Die Fläche der Grenzkurve ist 1,6*Fläche des gleichseitigen Dreiecks Bei jedem Iterationsschritt vergrößert sich die Fläche: Beim ersten Schritt um 3*(1/9); beim zweiten um 3*4*1/81, beim n-ten Schritt um Damit ist die Flächensumme GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Rekursives Programm lesen Was wird bei dem folgenden Beispiel gezeichnet? def dreieck(laenge, s): for i in range(3): s.forward(laenge), s.left(120) def DF(L, n): if n==0 or L<10: dreieck(L,s) else: dreieck(L) s.up(), s.forward(5), s.left(60) s.forward(5), s.right(60), s.down() DF(L-15,n-1,s) Siehe dreiecke.py GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Baum01.py Man nennt eine Figur selbstähnlich, wenn man innerhalb der Figur eine oder mehrere verkleinerte Kopien der ganzen Figur finden kann. GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Selbstähnlichkeit Eine rekursive Zeichenprozedur ruft sich selbst im Anweisungsteil auf. Eine geometrische Figur heißt selbstähnlich, wenn sie sich in kongruente Teile zerlegen lässt, die ihr alle ähnlich sind. Vergrößern wir eine der Teilfiguren, so ergibt sich das Ganze. Selbstähnliche Figuren lassen sich mit der Initiator-Generator-Methode erzeugen. Sie funktioniert wie folgt: In einem Streckenzug I, dem Initiator, wird jede Strecke durch eine Figur G, den Generator, ersetzt. Daraufhin wird jede (oder nur manche) Strecke der erzeugten Figur durch die Generatorfigur G ersetzt. Diese Streckenersetzung wird beliebig lange wiederholt. Aufgabe: Was ist der Generator bei der Kochkurve, was beim Baum. GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Rekursives Programm lesen if laenge<10: # Initiator s.forward(laenge), s.backward(laenge) return else: # Generator, eine Figur wird ersetzt. s.forward(laenge) s.right(45), zeichne_Baum(laenge/2,s) s.left(90), zeichne_Baum(laenge/2,s) s.right(45), s.backward(laenge) Siehe Baum01.py Aufgabe: Erstelle Py-Prg Baum01.py, das den Baum der vorigen Folie zeichnet. Die Verzeigung beträgt links und recht 45°, die Astlänge wird je Schritt halbiert. Lösung: Siehe Baum.py http://lakk.bildung.hessen.de/netzwerk/faecher/informatik/delphi/rekgraf/rekgraf7.htm.html GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Baum0x.py Ändere das Baumprogramm, mache den Baum realistischer. Baum02.py: Die Baumdicke ändern Baum04.py: Links und rechts soll der Baum variert werden. Baum06.py: Bringe den Zufall ins Spiel, d.h. die Baumdicke und Länge soll sich zufällig ändern. Verwende: import random as ra ra.gauss(Mittelwert, Stdabweichung) ra.gauss(stuecklaenge, stuecklaenge*zuf) mit zuf etwa 0,3. stuecklaengeA=int(ra.gauss(stuecklaenge, stuecklaenge*zuf)) Wenn Dir das Zeichnen zu lange geht, verwende hugo.tracer(0) # sofort zeichnen GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Farn01 Ein Farn ist recht simpel aufgebaut. Der Kern des Programms: def zeichneFarn(s, hoehe=200.): # Funktionsdefinition if hoehe >3: # falls Zeichenweg groß genug s.forward(hoehe) s.left(25) zeichneFarn(s, hoehe*0.5) # linker Teilbaum s.right(35) zeichneFarn(s, hoehe*0.7) # mittlerer Teilbaum s.right(25) zeichneFarn(s, hoehe*0.4) # rechter Teilbaum s.left(35) s.backward(hoehe) else: GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Pythagorasbaum.py Der Initiator ist eine waagrechte Strecke. Der Generator: Ersetze die Strecke durch ein Quadrat mit einem rechtwinkligen Dreieck c:a:b=5:4:3 auf der Oberseite. Dabei werden die beiden Katheten des Dreiecks wieder durch den Generator ersetzt. Der Winkel bei der kürzeren Seite ist http://lakk.bildung.hessen.de/netzwerk/faecher/informatik/delphi/rekgraf/rekgraf5.htm.html GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Drachenkurve Attraktive rekursive Grafiken basieren oft auf dem Orientierungswechsel. Die Drachenkurve entsteht, wenn beim Generator abwechselnd der Haken nach links bzw. nach rechts ausgeführt wird. http://lakk.bildung.hessen.de/netzwerk/faecher/informatik/delphi/rekgraf/rekgraf7.htm.html GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Sierpinski-Dreieck Das Sierpinksi-Dreieck entsteht dadurch, dass man von einem Dreieck iterativ das mittlere Viertel wegnimmt und dies bei den verbliebenden Dreiecken wiederholt. Siehe auch http://de.wikipedia.org/ wiki/Sierpinski-Dreieck Lese Doku\einfuehrung Rekursion.pdf S. 8 GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Lösung Sierpinski def sierpinski(s, laenge, stufe, farbe): s.fillcolor(farbe) pos=s.position() s.left(60), s.forward(laenge), s.right(60) s.begin_fill() for i in range(0,3): s.forward(laenge) s.right(120) s.end_fill() if stufe>1: sierpinski(s,laenge/2, stufe-1, farbe) s.forward(laenge), s.right(120) s.up(), s.goto(pos), s.down() return GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Türme von Hanoi Das Spiel benutzt drei Stäbe und eine Anzahl von Scheiben z.B. 9, die auf die Stäbe gesteckt werden können. Anfänglich befinden sich alle Scheiben in absteigender Größe auf einem Stab angeordnet, d.h. die größte ist ganz unten und die kleinste ganz oben. Die Aufgabe besteht darin, diesen Turm von einem Stab auf einen anderen zu bewegen unter Beachtung der folgenden Regeln: In einem Zug darf immer nur eine Scheibe bewegt werden. Es kann immer nur die oberste Scheibe eines Stapels bewegt werden. Eine Scheibe kann auf einem anderen Stab nur abgelegt werden, wenn der Stab leer ist, oder wenn die Scheibe kleiner als die oberste Scheibe des Zielstapels ist. Lese http://www.python-kurs.eu/tuerme_von_hanoi.php und erstelle das zughörige Programm GZG FN W.Seyboldt Inf K1/2 Sj 13/14

Quellen Fraktale und Chaos (Mandelbrotmenge): Siehe http://mathematik.ph-weingarten.de/~hafenbrak/docs/chaos06/chaos01.pdf http://mathematik.ph-weingarten.de/~hafenbrak/docs/chaos06/chaos02.pdf http://mathematik.ph-weingarten.de/~hafenbrak/docs/chaos06/chaos03.pdf http://mathematik.ph-weingarten.de/~hafenbrak/docs/chaos06/chaos04.pdf http://mathestuff.de/rekursion_mit_python https://ddi.ifi.lmu.de/tdi/2013/upload/materialien-visualisierung-rekursiver-datenstrukturen/ Butterfly (Tkinter) http://www.pythonmania.de/article/pybutt.html Informatikunterlagen http://www.inf-schule.de/ Selbstähnlihckeit, Zusf. Lese http://stubber.math-inf.uni-greifswald.de/~bandt/talks/gwd07.pdf http://mathestuff.de/rekursion_mit_python GZG FN W.Seyboldt Inf K1/2 Sj 13/14