Informatik I. Informatik I Iteration vs. Rekursion. Iteration vs. Rekursion Iteration vs. Rekursion. 20. Iteration vs.

Ähnliche Dokumente
Diskrete Strukturen Kapitel 2: Grundlagen (Beweise)

Die Ausgangsposition. Der aus drei Scheiben bestehende Turm steht auf Platz 1.

Theoretische Informatik SS 03 Übung 3

Programmieren lernen mit Groovy Rekursion Rekursion und Iteration

Türme von Hanoi. Worum geht es? Iterativer Algorithmus

Mathematik und Logik

Einführung in die Informatik 1

mathe plus Aussagenlogik Seite 1

Mathematische Grundlagen der Ökonomie Übungsblatt 8

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Induktive Beweise und rekursive Definitionen

Kapitel 3. Natürliche Zahlen und vollständige Induktion

1 Das Prinzip der vollständigen Induktion

II.3.1 Rekursive Algorithmen - 1 -

11. Rekursion, Komplexität von Algorithmen

Konzepte und Methoden der Programmierung Lösungen P. Fierz / FS 2012

Ein Algorithmus heißt rekursiv, wenn er sich selbst aufruft. Meist werden nur einzelne Module eines Gesamtalgorithmus rekursiv verwendet.

4. Fortgeschrittene Algorithmen 4.1 Rekursion 4.2 Daten und Datenstrukturen 4.3 Bäume

Fachwissenschaftliche Grundlagen

Vorkurs Informatik WiSe 16/17

SWP Prüfungsvorbereitung

Vorlesung. Vollständige Induktion 1

Handout zu Beweistechniken

3. rekursive Definition einer Folge

26 Hierarchisch strukturierte Daten

Rekursion und Induktion

Technische Universität München Zentrum Mathematik Mathematik 1 (Elektrotechnik) Übungsblatt 1

In diesem Abschnitt betrachten wir nur quadratische Matrizen mit Komponenten aus einem Körper K, also A K n n für ein n N. Wenn (mit einem n > 1)

Theoretische Informatik. Alphabete, Worte, Sprachen

Aufgaben und Lösungen zum Vorkurs Mathematik: Beweismethoden Für Mittwoch den

Beim rekursiven Aufruf einer Funktion wird jeweils ein Duplikat der gesamten Funktion im Speicher abgelegt.

Induktive Beweise und rekursive Definitionen

Informatik I Rekursion

Vollständige Induktion

Rekursive Funktionen

Kapitel 5: Abstrakte Algorithmen und Sprachkonzepte. Elementare Schritte

Grundlagen der Programmierung

I. Aussagenlogik. Aussagenlogik untersucht Verknüpfungen wie "und", "oder", "nicht", "wenn... dann" zwischen atomaren und komplexen Sätzen.

Algorithmen und Datenstrukturen

Beispiellösungen zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 6

Rekursive Algorithmen

Logik für Informatiker. 1. Grundlegende Beweisstrategien. Viorica Sofronie-Stokkermans Universität Koblenz-Landau

9 Türme von Hanoi Bewege Stapel von links nach rechts. In jedem Zug darf genau ein Ring bewegt werden. Es darf nie ein größerer auf einen kleine

Babeș-Bolyai Universität Cluj Napoca Fakultät für Mathematik und Informatik Grundlagen der Programmierung MLG5005. Rekursion

Übungen zu Grundlagen der Logik in der Informatik - WS15/16

Einführung in die Programmierung

Einführung in die Informatik I (autip)

Erwin Grüner

1 Mengen. 1.1 Elementare Definitionen. Einige mathematische Konzepte

Strukturelle Rekursion und Induktion

Übersicht. Schleifen. Schleifeninvarianten. Referenztypen, Wrapperklassen und API. 9. November 2009 CoMa I WS 08/09 1/15

Theoretische Informatik SS 03 Übung 4

12. Rekursion Grundlagen der Programmierung 1 (Java)

Fachwissenschaftliche Grundlagen

Speicher und Adressraum

Themen: Kubische Gleichungen, Ungleichungen, Induktion

Teil 14: Rekursive Programmierung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

Aufgaben und Lösungen zum Vorkurs Mathematik: Beweismethoden Für Donnerstag den x > 1 3x > 3 3x + 3 > 6 6x + 3 > 3x + 6.

Aufgabe 4.2 Sei G = (V, E, l) ein ungerichteter, gewichteter und zusammenhängender Graph.

Grundbegriffe der Informatik

Brückenkurs. Beweise. Anja Haußen Brückenkurs, Seite 1/23

Lösungen zur Vorrundenprüfung 2004

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

2 i. i=0. und beweisen Sie mittels eines geeigneten Verfahrens die Korrektheit der geschlossenen Form.

Donnerstag, 11. Dezember 03 Satz 2.2 Der Name Unterraum ist gerechtfertigt, denn jeder Unterraum U von V ist bzgl.

Komplexität von Algorithmen

6.1 Natürliche Zahlen 6.2 Induktion und Rekursion 6.3 Ganze, rationale, reelle und komplexe Zahlen 6.4 Darstellung von Zahlen

Reihen/Partialsummenfolgen und vollständige Induktion. Robert Klinzmann

Kapitel 1. Grundlagen Mengen

Einstieg in die Informatik mit Java

Logik und Beweise. Logik und Beweise. Vorsemesterkurs SoSe März 2016

Hackenbusch und Spieltheorie

Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen

3 Vom Zählen zur Induktion

Ersetzbarkeitstheorem

Technische Universität München WS 2012/13 Fakultät für Informatik Lösungsvorschläge zu Blatt 4 Dr. C. Herzog, M. Maalej 12.

Seminarvortrag aus Reiner Mathematik Existenz von Primitivwurzeln

2. Symmetrische Gruppen

Programmieren in Haskell Programmiermethodik

3. Argumentieren und Beweisen mit Punktemustern

Kapitel 1. Grundlagen

Die Ackermannfunktion

Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom : Rekursive Datentypen

Algorithmen und Datenstrukturen Tafelübung 4. Jens Wetzl 15. November 2011

Algorithmen II Vorlesung am

Entscheidungsbäume. Definition Entscheidungsbaum. Frage: Gibt es einen Sortieralgorithmus mit o(n log n) Vergleichen?

Wie werden die Vorlesungen/Übungen organisiert?

... direkte Umsetzung in Scheme. Prozeduren und von ihnen erzeugte Prozesse Gültigkeitsbereiche und Rekursion

Lösungen zu Ungerade Muster in Pyramiden. Muster: Die Summe der ungeraden Zahlen (in jeder Teilpyramide) ist stets eine Quadratzahl.

Theoretische Informatik

Rekursion. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Folgen und Reihen. 1. Folgen

Elementare Beweismethoden

Interpreter - Gliederung

Grundlagen der Programmierung in C Funktionen

Programmierung in C++

Weitere Beweistechniken und aussagenlogische Modellierung

Transkript:

Informatik I 1. Februar 2011 20. Informatik I 20. Jan-Georg Smaus 20.1 Albert-Ludwigs-Universität Freiburg 1. Februar 2011 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 1 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 2 / 31 20.1 Iterativer Algorithmus Python-Programm Zusammenfassung Wir haben am Beispiel von der Fakultätsfunktion und den Methoden für verlinkte Listen gesehen, dass man manche Probleme sowohl mit einer rekursiven als auch mit einer iterativen Funktion lösen kann. Die iterative ist meistens effizienter. Die rekursive Formulierung ist häufig eleganter und verständlicher. Wir werden heute ein Problem betrachten, das sich sehr einfach rekursiv lösen lässt, wohingegen die iterative Lösung überhaupt nicht offensichtlich ist: Türme von Hanoi. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 2 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 3 / 31

Spielbeschreibung (Erinnerung) Rekursive Prozedur (Erinnerung) Der Spielzustand besteht aus drei Säulen 1, 2, 3, auf denen insgesamt n Scheiben unterschiedlicher Größe aufgestapelt sind. Die Aufgabe des Puzzles ist es, den Turm auf einen der anderen Pfähle zu bewegen, allerdings unter folgenden Einschränkungen: Es wird nur eine Scheibe auf einmal bewegt. Es werden immer nur kleinere auf größere Scheiben gelegt. Folgende rekursive Scheme-Prozedur löst das Problem: (define hanoi (lambda (n) (if (zero? n) empty (let ((one-less (hanoi (- n 1)))) (append (renumber-moves one-less 3 2) (cons (make-hanoi-move 1 3) (renumber-moves one-less 1 2))))))) Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 4 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 5 / 31 Iterativer Algorithmus Iterativer Algorithmus Iterativer Algorithmus für Türme von Hanoi Pseudocode Buneman und Levy haben 1980 einen iterativen Algorithmus für die Türme von Hanoi vorgeschlagen [BL80]. Es ist nicht offensichtlich, dass dieser Algorithmus korrekt ist. Mein Python-Programm zu diesem Algorithmus hat knapp über 100 Zeilen. Dagegen lässt sich der Algorithmus in Pseudocode sehr leicht kommunizieren. Pseudocode ist ein Zwischending zwischen natürlicher Sprache und einer Programmiersprache. Er dient dazu, einem menschlichen Leser einen Algorithmus zu kommunizieren. Er sollte so präzise sein, dass ein Informatiker ihn unzweideutig versteht. Er sollte so abstrakt sein, dass ein Informatiker leicht den Überblick behält und sich nicht in Details verliert. Er sollte nur Konstrukte einer Programmiersprache verwenden, die so gängig sind, dass ein Informatiker sie in jedem Fall kennt. Häufig verwendet man Syntax, die sich an die Programmiersprache Pascal anlehnt. Wir lehnen uns aber hier an Python an. Natürlich gibt es keine allgemein anerkannte Definition von Pseudocode. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 6 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 7 / 31

Iterativer Algorithmus Iterativer Algorithmus in Pseudocode if #n gerade: step = 1 else: step = 2 while #noch nicht fertig Es ist überhaupt nicht offensichtlich, dass der Algorithmus korrekt ist. Selbst wenn er korrekt ist, stellt sich die Frage, ob er das Problem optimal löst. Beide Aussagen werden wir jetzt beweisen mittels vollständiger Induktion. Probieren wir s aus für n = 1, 2, 3, 4... Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 8 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 9 / 31 Das Beweisschema der vollständigen Induktion (Erinnerung) Satz Sei P(n) eine Eigenschaft einer Zahl n N (Prädikat). Zeige ( n N) P(n). Definiere M := {n N P(n) gilt} N. Induktionsaxiom: Falls 0 M und ( n) n M n M dann M = N. Induktionsschema Falls P(0) (Induktionsbasis, -anfang) und ( n) P(n) P(n ) (Induktionsschritt) dann ( n N) P(n). (P(n) Induktionshypothese, -behauptung) Satz 1. Die vom Algorithmus berechnete Zugfolge bewegt den Hanoi-Turm der Größe n vom ersten auf den dritten Pfahl. 2. Es gibt keine kürzere Zugfolge, die den Hanoi-Turm der Größe n vom ersten auf den dritten Pfahl bewegt. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 10 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 11 / 31

Induktionsbasis Induktionsschritt Für n = 1 ist step = 1, da 1 ungerade ist. Die kleinste Scheibe wird von Pfahl 1 nach Pfahl 3 bewegt. Gemäß den Spielregeln ist es nicht möglich, eine nichtkleinste Scheibe zu bewegen, da es gar keine solche gibt. Das Problem ist in einem Zug gelöst, was offensichtlich optimal ist. Nimm an, für n gelte die Induktionshypothese. Sei f (n) die Anzahl der berechneten Züge (optimal). Betrachten wir nun zuerst den Fall, dass n gerade ist. Wir wenden nun den Algorithmus auf n + 1 an. Wir halten zunächst folgende Beobachtung fest: GS fix Die größte Scheibe kann nicht bewegt werden, bevor nicht der Turm bis auf die größte Scheibe vollständig von Pfahl 1 wegbewegt worden ist, sei es auf Pfahl 2 oder auf Pfahl 3. Hilfssatz Die ersten f (n) Züge des Algorithmus für n + 1 Scheiben sind die Züge des Algorithmus für n Scheiben, wobei Pfahl 2 und Pfahl 3 vertauscht sind. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 12 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 13 / 31 Beweis des Hilfssatzes Induktionsschritt für den Hilfssatz Ia Den Hilfssatz beweisen wir ebenfalls mittels vollständiger Induktion über die Anzahl der Züge. Wir bezeichen den Algorithmus für n als Alg(n) und für n + 1 als Alg(n + 1). Induktionsbasis (erster Zug): Alg(n + 1) bewegt die kleinste Scheibe von Pfahl 1 nach Pfahl 3. Alg(n) Scheiben bewegt die kleinste Scheibe von Pfahl 1 nach Pfahl 2. Also: gleiche Zugfolge aber mit Pfahl 2 und Pfahl 3 vertauscht. Fall 1: der (j + 1)te Zug ist in Alg(n) liegt die kleinste Scheibe auf i = 1: dann bewegt Alg(n) die kleinste Scheibe nach Pfahl 2. Nach Induktionshypothese liegt die Scheibe in Alg(n + 1) ebenfalls auf i = 1 und wird nach Pfahl 3 bewegt. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 14 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 15 / 31

Induktionsschritt für den Hilfssatz Ib Induktionsschritt für den Hilfssatz Ic Fall 1: der (j + 1)te Zug ist in Alg(n) liegt die kleinste Scheibe auf i = 2: dann bewegt Alg(n) die kleinste Scheibe nach Pfahl 3. Nach Induktionshypothese liegt die Scheibe in Alg(n + 1) auf i = 3 und wird nach Pfahl 2 bewegt. Fall 1: der (j + 1)te Zug ist in Alg(n) liegt die kleinste Scheibe auf i = 3: dann bewegt Alg(n) die kleinste Scheibe nach Pfahl 1. Nach Induktionshypothese liegt die Scheibe in Alg(n + 1) auf i = 2 und wird nach Pfahl 1 bewegt. Insgesamt gilt: der (j + 1)te Zug von Alg(n) und Alg(n + 1) ist der gleiche, bis auf dass Pfahl 2 und Pfahl 3 vertauscht sind. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 16 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 17 / 31 Induktionsschritt für den Hilfssatz IIa Induktionsschritt für den Hilfssatz IIb in Alg(n) liegt die zweitkleinste oben liegende Scheibe auf Pfahl 1, und die drittkleinste auf Pfahl 2: dann macht Alg(n) einen Zug von Pfahl 1 nach Pfahl 2. Nach Induktionshypothese liegt in Alg(n + 1) die zweitkleinste oben liegende Scheibe auf Pfahl 1, und die drittkleinste auf Pfahl 3, und Alg(n) macht einen Zug von Pfahl 1 nach Pfahl 3. in Alg(n) liegt die zweitkleinste oben liegende Scheibe auf Pfahl 1, und die drittkleinste auf Pfahl 3: dann macht Alg(n) einen Zug von Pfahl 1 nach Pfahl 3. Nach Induktionshypothese liegt in Alg(n + 1) die zweitkleinste oben liegende Scheibe auf Pfahl 1, und die drittkleinste auf Pfahl 2, und Alg(n) macht einen Zug von Pfahl 1 nach Pfahl 2. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 18 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 19 / 31

Induktionsschritt für den Hilfssatz IIc Induktionsschritt für den Hilfssatz IId in Alg(n) liegt die zweitkleinste oben liegende Scheibe auf Pfahl 2, und die drittkleinste auf Pfahl 1: dann macht Alg(n) einen Zug von Pfahl 2 nach Pfahl 1. Nach Induktionshypothese liegt in Alg(n + 1) die zweitkleinste oben liegende Scheibe auf Pfahl 3, und die drittkleinste auf Pfahl 1, und Alg(n) macht einen Zug von Pfahl 3 nach Pfahl 1. in Alg(n) liegt die zweitkleinste oben liegende Scheibe auf Pfahl 2, und die drittkleinste auf Pfahl 3: dann macht Alg(n) einen Zug von Pfahl 2 nach Pfahl 3. Nach Induktionshypothese liegt in Alg(n + 1) die zweitkleinste oben liegende Scheibe auf Pfahl 3, und die drittkleinste auf Pfahl 2, und Alg(n) macht einen Zug von Pfahl 3 nach Pfahl 2. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 20 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 21 / 31 Induktionsschritt für den Hilfssatz IIe in Alg(n) liegt die zweitkleinste oben liegende Scheibe auf Pfahl 3, und die drittkleinste auf Pfahl 1: dann macht Alg(n) einen Zug von Pfahl 3 nach Pfahl 1. Nach Induktionshypothese liegt in Alg(n + 1) die zweitkleinste oben liegende Scheibe auf Pfahl 2, und die drittkleinste auf Pfahl 1, und Alg(n) macht einen Zug von Pfahl 2 nach Pfahl 1. Induktionsschritt für den Hilfssatz IIf in Alg(n) liegt die zweitkleinste oben liegende Scheibe auf Pfahl 3, und die drittkleinste auf Pfahl 2: dann macht Alg(n) einen Zug von Pfahl 3 nach Pfahl 2. Nach Induktionshypothese liegt in Alg(n + 1) die zweitkleinste oben liegende Scheibe auf Pfahl 2, und die drittkleinste auf Pfahl 3, und Alg(n) macht einen Zug von Pfahl 2 nach Pfahl 3. Insgesamt gilt: der (j + 1)te Zug von Alg(n) und Alg(n + 1) ist der gleiche, bis auf dass Pfahl 2 und Pfahl 3 vertauscht sind. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 22 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 23 / 31

Hilfssatz und Korollar Turm n von Pfahl 1 nach Pfahl 2 Da die kleinste Scheibe nach f (n) Schritten auf Pfahl 2 zuoberst aufliegt, muss der f (n)te Schritt ein Schritt gemäß Hilfssatz Die ersten f (n) Züge des Algorithmus für n + 1 Scheiben sind die Züge des Algorithmus für n Scheiben, wobei Pfahl 2 und Pfahl 3 vertauscht sind. Korollar Die ersten f (n) Züge des Algorithmus für n + 1 Scheiben bewegen den Turm bis auf die größte Scheibe von Pfahl 1 nach Pfahl 2. gewesen sein. Demnach ist aber im f (n) + 1ten Schritt möglich und kann nur bedeuten: bewege die größte Scheibe von Pfahl 1 nach Pfahl 3. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 24 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 25 / 31 Turm n von Pfahl 2 nach Pfahl 3 Ganz analog zum Hilfssatz Hilfssatz Die ersten f (n) Züge des Algorithmus für n + 1 Scheiben sind die Züge des Algorithmus für n Scheiben, wobei Pfahl 2 und Pfahl 3 vertauscht sind. kann man nun zeigen: Hilfssatz 2 Der Algorithmus für n + 1 Scheiben, angewandt auf den Spielzustand, in dem der Turm bis auf die größte Scheibe auf Pfahl 2 liegt, bewegt diesen Turm in f (n) Zügen von Pfahl 2 auf Pfahl 3. Gesamte Zugfolge Der Algorithmus für n + 1 Scheiben bewegt also in 2 f (n) + 1 Zügen den Turm von Pfahl 1 nach Pfahl 3. Da f (1) = 1, folgt f (n) = 2 n 1 (einfacher Induktionsbeweis). Aufgrund von GS fix kann es nicht besser gehen. Wir haben angenommen, dass n gerade ist. Der Fall, dass n ungerade ist, ist aber ganz analog. Somit haben wir gezeigt: Satz 1. Die vom Algorithmus berechnete Zugfolge bewegt den Hanoi-Turm der Größe n vom ersten auf den dritten Pfahl. 2. Es gibt keine kürzere Zugfolge, die den Hanoi-Turm der Größe n vom ersten auf den dritten Pfahl bewegt. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 26 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 27 / 31

Python-Programm Python-Programm Das Hauptprogramm ist selbst in echtem Python-Code nicht sehr kompliziert: python.py if n % 2 == 0: step = 1 else: step = 2 state = State(n) continu = True while continu: state.move_smallest(step) continu = state.move_other() Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 28 / 31 Wieso > 100 Zeilen? python.py class State: def init (self, n): self.one = empty self.two = empty self.three = empty for i in range(n, 0, -1): self.one = self.one.cons(i) Der Spielzustand ist mittels einer Klasse implementiert, die drei Attribute für die drei Pfähle hat. Es gibt 6 mögliche Züge (1 2, 1 3, 2 1, 2 3, 3 1, 3 2), was zu allerhand Fallunterscheidungen mit symmetrischen Fällen führt. Besser wäre, man könnte mittels Indizes auf die Pfähle zugreifen, wie Sie es schon aus den Übungen kennen. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 29 / 31 Zusammen- fassung Zusammen- fassung Zusammenfassung Literatur I Wir haben ein Beispiel für ein Problem gesehen, dass eine einfache rekursive Lösung hat, und außerdem eine iterative Lösung, deren Korrektheit aber überhaupt nicht offensichtlich ist. Wir haben die Korrektheit und Optimalität der iterativen Lösung bewiesen, und somit die Äquivalenz zur rekursiven Lösung. Unser Beweis hat durchaus an einigen Stellen an die Intuition appelliert, erfüllt aber die Anforderungen an Strenge, die gemeinhin in der Informatik üblich sind. Der Zweck dieses Kapitels war einerseits, Iteration und Rekursion zu vergleichen, aber vor allem, noch mehr Übung im Beweisen zu erlangen. Peter Buneman and Leon S. Levy. The towers of hanoi problem. Inf. Process. Lett., 10(4/5):243 244, 1980. Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 30 / 31 Jan-Georg Smaus (Universität Freiburg) Informatik I 1. Februar 2011 31 / 31