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

Ähnliche Dokumente
1 2 3 Bewege Stapel von links nach rechts. In jedem Zug darf genau ein Ring bewegt werden. Es darf nie ein größerer auf einen kleineren Ring gelegt we

Offenbar hängt das Ergebnis nur von der Summe der beiden Argumente ab...

Das Kontrollfluss-Diagramm für Ò ¼ µ:

8 DieTürmevonHanoi. Problem:

II.3.1 Rekursive Algorithmen - 1 -

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

11. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Mathematische Rekursion. Rekursion in Java: Genauso! Unendliche Rekursion. n!

12. Rekursion. 1, falls n 1. n (n 1)!, andernfalls. Lernziele. Mathematische Rekursion. Rekursion in Java: Genauso! n! =

Welche Informatik-Kenntnisse bringen Sie mit?

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Institut fu r Informatik

Lexikalische Programmanalyse der Scanner

Vorsichtige Programmierer verwenden Inkrement- Operatoren nicht in komplizierteren Ausdrücken

Programmieren in Java

8 Anwendung: Suchen. Folge a ganzer Zahlen; Element x. Wo kommt x in a vor?

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Rekursive Funktionen

Java für Anfänger Teil 4: Anweisungen. Programmierkurs Manfred Jackel

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

Die for -Schleife HEUTE. Schleifen. Arrays. Schleifen in JAVA. while, do reichen aus, um alle iterativen Algorithmen zu beschreiben

Gedächtnis. Während der Abarbeitung eines Algorithmus müssen sich Dinge gemerkt werden bzw. auf Dingen wird gerechnet. Zugriff.

Die Türme von Hanoi. Wollen

Kasparov versus Deep Blue. Till Tantau. Institut für Theoretische Informatik Universität zu Lübeck

Einstieg in die Informatik mit Java

Javakurs für Anfänger

Anweisungen zur Ablaufsteuerung

Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl

Java - Programmierung - Prozedurale Programmierung 1

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

Programmierung für Mathematik (HS13)

5.3 Auswertung von Ausdrücken

Vorkurs Informatik WiSe 17/18

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Vorkurs Informatik WiSe 16/17

Einstieg in die Informatik mit Java

14 Abstrakte Klassen, finale Klassen, Interfaces

1 Bedingte Anweisungen. 2 Vergleiche und logische Operatoren. 3 Fallunterscheidungen. 4 Zeichen und Zeichenketten. 5 Schleifen.

Einstieg in die Informatik mit Java

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Algorithmen zur Datenanalyse in C++

14 Abstrakte Klassen, finale Klassen, Interfaces

Einstieg in die Informatik mit Java

Hochschule Darmstadt Informatik-Praktikum SS 2018 EIT Bachelor 3. Aufgabenblatt Funktionen - Unterprogramme

Java I Vorlesung Objektorientiertes Programmieren

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Einstieg in die Informatik mit Java

12 Abstrakte Klassen, finale Klassen und Interfaces

Programmiertechnik Übungen zu Klassen & -methoden

Java Ablaufsteuerung (Beispiele)

3. Anweisungen und Kontrollstrukturen

Computergrundkenntnisse und Programmieren, WS 07/08, Übung 11: Klassen der Standardbibliothek 2

4.4 Imperative Algorithmen Prozeduren

Grundlagen der Modellierung und Programmierung, Übung

Java Übung. Übung 3. Werner Gaulke. 2. Mai Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Javakurs für Anfänger

Rekursive Funktionen

Nachklausur: Grundlagen der Informatik I, am 02. April 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Nachklausur: Grundlagen der Informatik I, am 02. April 2008 Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Listing 1: Cowboy. Listing 2: Woody

FHZ. K13 Rekursion. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Kapitel 2: Grundelemente der Programmierung

Übung Algorithmen und Datenstrukturen

Informatik I (D-ITET)

11. Rekursion. - Wiederholung von Anweisungen: durch Iteration und Rekursion - Anwendungsfälle der Rekursion

EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 14/15

IT Basics 2 Handout u

Selbststudium OOP8 & ALG3 Aufgaben

public class SternchenRechteckGefuellt {

Java Anweisungen und Ablaufsteuerung

Speicher und Adressraum

2 Programmieren in Java I noch ohne Nachbearbeitung

Aufgabenblatt 1. Kompetenzstufe 1. Allgemeine Informationen zum Aufgabenblatt:

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Nachklausur zu Einführung in die Programmierung 14. Oktober 2008 (SS 2008) Prof. Dr. Franz Schweiggert / Christoph Ott

// Objekt-Methoden: public void insert(int x) { next = new List(x,next); } public void delete() { if (next!= null) next = next.next; } public String

Städtisches Gymnasium Olpe Java Ht Informatik - Q1 Die Klasse List im Abitur Methoden und Beispielcode Hier alle wichtigen Methoden. Ein Beispielcode

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

Dr. Lars Hildebrand Fakultät für Informatik Technische Universität Dortmund

Informatik II. Woche 15, Giuseppe Accaputo

Einführung in die Informatik I

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Klassenmethoden Teil 2

Vorbereitende Aufgaben

Technische Universität Braunschweig Institut für Programmierung und Reaktive Systeme

Programmiertechnik Methoden, Teil 2

Übungen zu Programmieren - Code-Formatierung -

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

Sprachkonstrukte Verzweigungen und Array-Strukturen

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Einführung in die Informatik 1

Transkript:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

9 Türme von Hanoi Idee Für Turm der Höhe h 0 ist das Problem trivial. Falls h > 0 zerlegen wir das Problem in drei Teilprobleme: 1. Versetze oberen h 1 Ringe auf freien Platz 2. Bewege die unterste Scheibe zum Ziel 3. Versetze die zwischengelagerten Ringe zum Ziel Versetzen eines Turms der Höhe h > 0 erfordert also zweimaliges Versetzen eines Turms der Höhe h 1. Es gibt keine andere Möglichkeit!!! 9 Türme von Hanoi Harald Räcke 189/378

Implementierung 1 public s t a t i c void move( i n t h, byte a, byte b) { 2 i f ( h > 0) { 3 byte c free ( a, b) ; 4 move( h-1,a, c ) ; 5 write ( "move "+a+" to "+b+" \n" ) ; 6 move( h-1, c, b) ; 7 } 8 }... bleibt die Ermittlung des freien Rings 9 Türme von Hanoi Harald Räcke 190/378

Beobachtung Offenbar hängt das Ergebnis nur von der Summe der beiden Argumente ab... 0 1 2 0 2 1 1 2 0 2 1 0 free(x,y) 0 1 2 0 1 2 1 1 3 2 2 3 sum(x,y) 9 Türme von Hanoi Harald Räcke 191/378

Implementierung Um solche Tabellen leicht implementieren zu können stellt Java das switch-statement zur Verfügung: 1 public s t a t i c byte free ( byte a, byte b) { 2 switch ( a + b) { 3 case 1: return 2; 4 case 2: return 1; 5 case 3: return 0; 6 default : return -1; 7 } 8 } 9 Türme von Hanoi Harald Räcke 192/378

Allgemeines Switch-Statement switch ( expr ) { case const 0 : (ss 0 )? ( break ; )? case const 1 : (ss 1 )? ( break ; )?... case const k 1 : (ss k 1 )? ( break ; )? ( default : ss k )? } expr sollte eine ganze Zahl/char, oder ein String sein. Die const i sind Konstanten des gleichen Typs. Die ss i sind alternative Statement-Folgen. default ist für den Fall, dass keine der Konstanten zutrifft Fehlt ein break-statement, wird mit den Statement-Folgen der nächsten Alternative fortgefahren!

Beispiel 1 int numofdays; 2 boolean schaltjahr true; 3 switch (monat) { 4 case "April": 5 case "Juni": 6 case "September": 7 case "November": 8 numofdays 30; 9 break; 10 case "Februar": 11 if (schaltjahr) 12 numofdays 29; 13 else 14 numofdays 28; 15 break; 16 default: 17 numofdays 31; 18 }

Der Bedingungsoperator Eine Alternative zu einem switch ist der Bedingungsoperator: condition? expr1 : expr2 Der Bedingungsoperator symbol name types L/R level? : Bedingungsoperator boolean, 2*typ rechts 14 9 Türme von Hanoi Harald Räcke 195/378

Beispiel: x y 1? 5 : y 4? z 2 : 8 x y 1? 5 : y 4? z 2 : 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x y 1? 5 : y 4? z 2 : 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x y 1? 5 : y 4? z 2 : 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x? 5 : y 4? z 2 : 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x? 5 : y 4? z 2 : 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x? 5 :? z 2 : 8 y 4

Beispiel: x y 1? 5 : y 4? z 2 : 8 x? 5 :? z 2 : 8 y 4

Beispiel: x y 1? 5 : y 4? z 2 : 8 x? 5 :?: z 2 8 y 4

Beispiel: x y 1? 5 : y 4? z 2 : 8 x? 5 :?: z 2 8 y 4

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 5?: z 2 8 y 4

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 5?: z 2 8 y 4

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 5?: 8 y 4 z 2

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 5?: 8 y 4 z 2

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 5?: 8 y 4 z 2

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 5?: 8 y 4 z 2 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 5?: 8 y 4 z 2 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int 5?: 8 y 4 z 2 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int 5?: 8 y 4 z 2 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int 5?: 3, int y 4 z 2 8 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int 5?: 3, int y 4 z 2 8 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int 5?: 3, int 1, int y 4 z 2 8 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int 5?: 3, int 1, int y 4 z 2 8 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 5?: 3, int 1, int y 4 z 2 8 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 5?: 3, int 1, int y 4 z 2 8 x 7 y 3 z 5

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 5?: 3, int 1, int x 7 y 3 z 5 y 4 3, int z 2 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 5?: 3, int 1, int x 7 y 3 z 5 y 4 3, int z 2 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 5?: 3, int 1, int x 7 y 3 z 5 y 4 3, int 4, int z 2 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 5?: 3, int 1, int x 7 y 3 z 5 y 4 3, int 4, int z 2 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 1, int x 7 y 3 z 5 5?: false, boolean y 4 3, int 4, int z 2 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 1, int x 7 y 3 z 5 5?: false, boolean y 4 3, int 4, int z 2 8

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 1, int x 7 y 3 z 5 5?: false, boolean y 4 3, int 4, int z 2 8 8, int

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 1, int x 7 y 3 z 5 5?: false, boolean y 4 3, int 4, int z 2 8 8, int

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 1, int x 7 y 3 z 5 5?: false, boolean y 4 3, int 4, int 8, int z 2 8 8, int

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 1, int x 7 y 3 z 5 5?: false, boolean y 4 3, int 4, int 8, int z 2 8 8, int

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 1, int x 7 y 3 z 5 8, int 5?: false, boolean y 4 3, int 4, int 8, int z 2 8 8, int

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 1, int x 7 y 3 z 5 8, int 5?: false, boolean y 4 3, int 4, int 8, int z 2 8 8, int

Beispiel: x y 1? 5 : y 4? z 2 : 8 x?: 7, int false, boolean 3, int 8, int 1, int x 8 y 3 z 5 8, int 5?: false, boolean y 4 3, int 4, int 8, int z 2 8 8, int

Beispiel numofdays "Januar".equals(monat)? 31 : "Februar".equals(monat)? (schaltjahr? 29 : 28) : "Maerz".equals(monat)? 31 : "April".equals(monat)? 30 : "Mai".equals(monat)? 31 : "Juni".equals(monat)? 30 : "Juli".equals(monat)? 31 : "August".equals(monat)? 31 : "September".equals(monat)? 30 : "Oktober".equals(monat)? 31 : "November".equals(monat)? 30 : "Dezember".equals(monat)? 31 : -1 ;

Implementierung Für unseren Fall geht das viel einfacher: 1 public s t a t i c byte free ( byte a, byte b) { 2 return ( byte ) ( 3 - ( a+b) ) ; 3 }

9 Türme von Hanoi Bemerkungen: move() ist rekursiv, aber nicht end-rekursiv. Sei N(h) die Anzahl der ausgegebenen Moves für einen Turm der Höhe h 0. Dann ist { 0 für h 0 N(h) 1 + 2N(h 1) andernfalls Folglich ist N(h) 2 h 1. Bei genauerer Analyse des Problems lässt sich auch ein nicht ganz so einfacher nicht-rekursiver Algorithmus finden. Hinweis: Offenbar rückt die kleinste Scheibe in jedem zweiten Schritt eine Position weiter...