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

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

  • View
    110

  • Download
    1

Embed Size (px)

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

  • Folie 1
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 1 SFZ FN Sj. 13/14 Python 3 Rekursion
  • Folie 2
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 2 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 Zurckfhren 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 Verknpfung 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 heit, 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 zurckgegeben. Ist n==1: return 1. Bestimme die ersten 100 Glieder von der Folge (n!)
  • Folie 3
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 3 Rechenzeit Rekursionen sind langsam und erfordern vom PC viel Aufwand. Wir wollen nun die Rechenzeit bestimmen, die man bentigt, um alle Fakultten rekursiv von 1 bis 500 zu bestimmen. Ergnze fak01 und speichere es als fak01a.py um die bentigten Befehle. from time import time startzeit = time() Rechnung endzeit = time() print "Bentigte Rechenzeit = %8.6f s" %(endzeit-startzeit)
  • Folie 4
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 4 Iteration statt Rekursion Wie kann man die Probleme von rekursiven Methoden lsen? Oft kann man Rekursionen durch Schleifen ersetzen Oder man wendet das Prinzip der Rekursion mit Generatoren an fak02.py: Schreibe ein Programm, das die Fakultt 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 nchsten Folie schauen wir uns ein komplexeres Problem an.
  • Folie 5
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 5 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 "knstlichen" Kaninchenproblem, das die folgenden Bedingungen erfllt: 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.
  • Folie 6
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 6 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 lsst sich dies verbessern? Ein iterative Lsung findet sich nicht (so leicht). Was geht dann? Python bietet zwei Verfahren
  • Folie 7
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 7 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 fr fibr2() Ergebnis: Wenn wir fibr1(35) aufrufen, bentigt 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.
  • Folie 8
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 8 fibr2() - Vorschlag fibMem=[0,1,1] # fibr2(0)..fibr2(2) # Dies ist die globale Liste, die fib02 verwendet. def fibr2(n): # berprfe zuerst, ob fib(n) schon berechnet wurde if n1: for i in range(0,3): sierpinski(s,laenge/2, stufe-1, farbe) s.forward(laenge), s.right(120) s.up(), s.goto(pos), s.down() return
  • Folie 30
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 30 Trme von Hanoi Das Spiel benutzt drei Stbe und eine Anzahl von Scheiben z.B. 9, die auf die Stbe gesteckt werden knnen. Anfnglich befinden sich alle Scheiben in absteigender Gre auf einem Stab angeordnet, d.h. die grte 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 zughrige Programmhttp://www.python-kurs.eu/tuerme_von_hanoi.php
  • Folie 31
  • Inf K1/2 Sj 13/14 GZG FN W.Seyboldt 31 Quellen Fraktale und Chaos (Mandelbrotmenge): Siehe http://mathematik.ph- weingarten.de/~hafenbrak/docs/chaos06/chaos01.pdf 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/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/ https://ddi.ifi.lmu.de/tdi/2013/upload/materialien- visualisierung-rekursiver-datenstrukturen/ Butterfly (Tkinter) http://www.pythonmania.de/article/pybutt.htmlhttp://www.pythonmania.de/article/pybutt.html Informatikunterlagen http://www.inf-schule.de/http://www.inf-schule.de/ Selbsthnlihckeit, Zusf. Lese http://stubber.math-inf.uni- greifswald.de/~bandt/talks/gwd07.pdfhttp://stubber.math-inf.uni- greifswald.de/~bandt/talks/gwd07.pdf