Module und Rekursion Vorsemesterkurs Informatik Praktischer Teil WS2012/13 4. Oktober 2012 Vorkurs Informatik - WS 2012/13 Module und Importe Vorkurs Informatik - WS 2012/13 Wofür überhaupt? Python liefert zunächst die wichtigsten Funktionalitäten Was wenn man mehr braucht? Selbst implementieren Fertige Funktionen importieren Warum nicht alles gleich am Anfang importieren? Vorkurs Informatik - WS 2012/13 Wie geht das? Definition Ein Python-Modul ist eine Datei mit Python-Definitionen und -Anweisungen. Was wird importiert? Module oder ihre Anteile Syntax: Das ganze Modul laden: import MODULNAME Ausgewählte Funktionen aus dem Modul laden: from MODULNAME import FUNKTION1, FUNKTION2, … Alle Funktionen aus diesem Modul laden: from MODULNAME import * Vorkurs Informatik - WS 2012/13 Beispiele Syntax: Das ganze Modul laden: >>> import random >>> random.randint(0, 10) 10 Ausgewählte Funktionen aus dem Modul laden: >>> from random import randint >>> randint(0, 10) 5 Vorkurs Informatik - WS 2012/13 Was wähle ich aus? Wann was benutzen? import MODULE Normalerweise from MODULE import … - Bei häufiger Verwendung - Beim Testen auf der Konsole - Achtung: Gleiches Scope! Vorkurs Informatik - WS 2012/13 Existierende Module Nützliche Module: random Funktionen: random(), randint(), … http://docs.python.org/release/3.2/library/random.html math Funktionen: ceil(), floor(), exp(), sqrt(), … http://docs.python.org/release/3.2/library/math.html Vorkurs Informatik - WS 2012/13 Rekursion Vorkurs Informatik - WS 2012/13 Was ist Rekursion? “Um Rekursion zu verstehen, muss man erstmal Rekursion verstehen” Prinzip: Funktion ruft sich selbst auf Vorkurs Informatik - WS 2012/13 Braucht man sie wirklich? Wofür ist Rekursion gut? Rekursiv definierte mathematische Konstrukte (häufig) elegantere, kürzere und verständlichere Algorithmen [als iterative Alternativen] Wofür ist Rekursion schlecht? Funktionen mit mehreren (großen) Parametern Vorkurs Informatik - WS 2012/13 Gefahr der Rekursion Wie Endlosrekursion stoppen? def recursion(): recursion() http://www.flickr.com/photos/torley/2361164281/ Vorkurs Informatik - WS 2012/13 Abbruchsbedingung Wie Endlosrekursion stoppen? Wir brauchen eine Abbruchbedingung! Vorgehen allgemein: def rek_fkt(parameter): if BEDINGUNG: return ERGEBNIS # mache ggf. etwas… return rek_fkt(NEUER_WERT) Abbruchbedingung rekursiver Aufruf Vorkurs Informatik - WS 2012/13 Beispiel Beispiel Fibonacci-Zahlen: (0, 1, 1, 2, 3, 5, 8, 13, …) Mathematische Definition: f(0) = 0, f(1) = 1 F.a. n ≥ 1: f(n) = f(n-1) + f(n-2) Implementierung: def fib_rek(n): if n < 2: # Abbruchbedingung return n http://de.wikipedia.org/w/index.php?title= Datei:FibonacciBlocks.svg return fib_rek(n-1) + fib_rek(n-2) # Rekursion Vorkurs Informatik - WS 2012/13 Ausführung der Rekursion Implementierung: def fib_rek(n): if n < 2: return n fib_rek(3) fib_rek(2) + fib_rek(1) return fib_rek(n-1) + fib_rek(n-2) fib_rek(1) + fib_rek(0) + 1 + + 1 1 0 Ergebnis: 2 Vorkurs Informatik - WS 2012/13 Rekursion vs. Iteration Beispiel Fakultätsfunktion n! Rekursion: Iteration: def fak_rek(n): if n < 2: return 1 def fak_it(n): if n < 2: return 1 return n * fak_rek(n-1) result = n while n > 1: n -= 1 result *= n return result Vorkurs Informatik - WS 2012/13 Ausblick: Übungsaufgabe (1/2) Aufgabenstellung Implementiere die Collatz-Funktion aus der Vorlesung als rekursive Python-Funktion. Die Funktion soll: - einen beliebigen Startwert als Parameter erhalten - bei jedem Aufruf die aktuelle Zahl ausgeben und - terminieren, sobald das erste Mal die Zahl 1 in der Folge auftaucht. def collatz(n): if n == 1: # Return für den Basisfall else: # Gebe n aus # Rufe sich rekursiv gemäß der Funktionsdefinition auf Vorkurs Informatik - WS 2012/13 Ausblick: Übungsaufgabe (2/2) Definition der Collatzfunktion def collatz(n): if n == 1: # Return für den Basisfall else: # Gebe n aus # Bestimme, ob n gerade ist (mittels Modulo-Rechnung) # Abhängig davon rufe sich rekursiv mit dem entspr. Parameter auf Vorkurs Informatik - WS 2012/13 Fragen? Vorkurs Informatik - WS 2012/13 Vielen Dank für die Aufmerksamkeit! Vorkurs Informatik - WS 2012/13