1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 -...

20
II.3.1 Rekursive Algorithmen - 1 - n 1. Grundelemente der Programmierung n 2. Objekte, Klassen und Methoden n 3. Rekursion und dynamische Datenstrukturen n 4. Erweiterung von Klassen und fortgeschrittene Konzepte

Transcript of 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 -...

Page 1: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 1 -

n  1. Grundelemente der Programmierung

n  2. Objekte, Klassen und Methoden

n  3. Rekursion und dynamische Datenstrukturen

n  4. Erweiterung von Klassen und fortgeschrittene Konzepte

Page 2: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 2 -

n  1. Rekursive Algorithmen

n  2. Rekursive (dynamische) Datenstrukturen

Page 3: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 3 -

public static int fak (int x) {

int res = 1;

while (x > 1) { res = x * res; x = x - 1; }

return res; }

Fakultät

public static int fak (int x) {

if (x > 1) return x * fak (x - 1); else return 1;

}

iterativ

rekursiv

Page 4: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 4 -

Fibonacci-Zahlen (nicht-lineare Rekursion)

public static int fib (int x) { if (x < 1) return 0; else if (x = = 1) return 1; else return fib (x - 1) + fib (x - 2); } nicht-linear

⎪⎩

⎪⎨

≥−+−

=

<

=

2)2fib()1fib(111,0

)fib(xxxxx

x

Page 5: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 5 -

public static boolean even (int x) {

if (x = = 0) return true; else if (x > 0) return odd (x - 1); else return odd (x + 1);

} public static boolean odd (int x) {

if (x = = 0) return false; else if (x > 0) return even (x - 1); else return even (x + 1);

}

even & odd (verschränkte Rekursion)

verschränkt

verschränkt

Page 6: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 6 -

sqrt (Endrekursion)

public static int fak (int x) {

if (x > 1) return x * fak (x - 1); else return 1;

}

public static float sqrt (float uG, float oG, float x) {

float m, epsilon = 1e-3f;

m = (uG + oG) / 2; if (oG - uG <= epsilon)return m; else if (m * m > x) return sqrt (uG, m, x); else return sqrt (m, oG, x); }

Endrekursion

Page 7: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 7 -

sqrt (Endrekursion)

float m, epsilon = 1e-3f;

for (;;) { m = (uG + oG) / 2; if (oG - uG <= epsilon)return m; else if (m * m > x) oG = m; else uG = m; }

public static float sqrt (float uG, float oG, float x) {

float m, epsilon = 1e-3f;

m = (uG + oG) / 2; if (oG - uG <= epsilon)return m; else if (m * m > x) return sqrt (uG, m, x); else return sqrt (m, oG, x); }

Page 8: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 8 -

Speicherorganisation bei Rekursion

public static int fak (int x) {

if (x > 1) return x * fak (x - 1); else return 1; }

x 3

res

x 1

res

Aufruf: fak(3)

x * fak(x - 1)

2 x

res x * fak(x - 1)

1

1

Page 9: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 9 -

Speicherorganisation bei Rekursion

public static int fak (int x) {

if (x > 1) return x * fak (x - 1); else return 1; }

x 3

res

Aufruf: fak(3)

x * fak(x - 1)

2 x

res x * fak(x - 1)

1

2

2

Page 10: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 10 -

Speicherorganisation bei Rekursion

public static int fak (int x) {

if (x > 1) return x * fak (x - 1); else return 1; }

x 3

res

Aufruf: fak(3)

x * fak(x - 1)

2

6

Page 11: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 11 -

Türme von Hanoi n  Aufgabe:

l  bewege die Scheiben von ALPHA über DELTA nach OMEGA l  es darf immer nur eine Scheibe bewegt werden l  niemals darf eine Scheibe auf eine kleinere bewegt werden

ALPHA OMEGA DELTA

n  Lösung (Divide & Conquer): l  allgemeine Lösung für einen Turm der Höhe h von ALPHA nach OMEGA

w  h = 0 gar nichts machen w  h > 0 1. Turm der Höhe h-1 von ALPHA über OMEGA nach DELTA

2. (Unterste) Scheibe von ALPHA nach OMEGA legen 3. Turm der Höhe h-1 von DELTA über ALPHA nach OMEGA

Page 12: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 12 -

Türme von Hanoi public class Hanoi {

private static void bewegeTurm (int hoehe, String von, String ueber, String nach) {

if (hoehe > 0) { bewegeTurm (hoehe-1, von, nach, ueber); druckeZug (hoehe, von, nach); bewegeTurm (hoehe-1, ueber, von, nach);

} } private static void druckeZug (int hoehe, String von, String nach) { System.out.println ("Scheibe " + hoehe + " von " + von + " nach " + nach);

} public static void main (String [] args) { bewegeTurm(Integer.parseInt(args[0]), "ALPHA", "DELTA", "OMEGA"); } }

Page 13: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 13 -

Türme von Hanoi 3 ALPHA DELTA OMEGA � 2 ALPHA OMEGA DELTA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA � Scheibe 2 von ALPHA nach DELTA � 1 OMEGA ALPHA DELTA � 0 OMEGA DELTA ALPHA � Scheibe 1 von OMEGA nach DELTA � 0 ALPHA OMEGA DELTA � Scheibe 3 von ALPHA nach OMEGA � 2 DELTA ALPHA OMEGA � 1 DELTA OMEGA ALPHA � 0 DELTA ALPHA OMEGA � Scheibe 1 von DELTA nach ALPHA � 0 OMEGA DELTA ALPHA � Scheibe 2 von DELTA nach OMEGA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA

ALPHA OMEGA DELTA

Page 14: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 14 -

Türme von Hanoi 3 ALPHA DELTA OMEGA � 2 ALPHA OMEGA DELTA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA � Scheibe 2 von ALPHA nach DELTA � 1 OMEGA ALPHA DELTA � 0 OMEGA DELTA ALPHA � Scheibe 1 von OMEGA nach DELTA � 0 ALPHA OMEGA DELTA � Scheibe 3 von ALPHA nach OMEGA � 2 DELTA ALPHA OMEGA � 1 DELTA OMEGA ALPHA � 0 DELTA ALPHA OMEGA � Scheibe 1 von DELTA nach ALPHA � 0 OMEGA DELTA ALPHA � Scheibe 2 von DELTA nach OMEGA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA

ALPHA OMEGA DELTA

Page 15: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 15 -

Türme von Hanoi 3 ALPHA DELTA OMEGA � 2 ALPHA OMEGA DELTA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA � Scheibe 2 von ALPHA nach DELTA � 1 OMEGA ALPHA DELTA � 0 OMEGA DELTA ALPHA � Scheibe 1 von OMEGA nach DELTA � 0 ALPHA OMEGA DELTA � Scheibe 3 von ALPHA nach OMEGA � 2 DELTA ALPHA OMEGA � 1 DELTA OMEGA ALPHA � 0 DELTA ALPHA OMEGA � Scheibe 1 von DELTA nach ALPHA � 0 OMEGA DELTA ALPHA � Scheibe 2 von DELTA nach OMEGA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA

ALPHA OMEGA DELTA

Page 16: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 16 -

Türme von Hanoi 3 ALPHA DELTA OMEGA � 2 ALPHA OMEGA DELTA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA � Scheibe 2 von ALPHA nach DELTA � 1 OMEGA ALPHA DELTA � 0 OMEGA DELTA ALPHA � Scheibe 1 von OMEGA nach DELTA � 0 ALPHA OMEGA DELTA � Scheibe 3 von ALPHA nach OMEGA � 2 DELTA ALPHA OMEGA � 1 DELTA OMEGA ALPHA � 0 DELTA ALPHA OMEGA � Scheibe 1 von DELTA nach ALPHA � 0 OMEGA DELTA ALPHA � Scheibe 2 von DELTA nach OMEGA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA

ALPHA OMEGA DELTA

1

Page 17: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 17 -

Türme von Hanoi 3 ALPHA DELTA OMEGA � 2 ALPHA OMEGA DELTA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA � Scheibe 2 von ALPHA nach DELTA � 1 OMEGA ALPHA DELTA � 0 OMEGA DELTA ALPHA � Scheibe 1 von OMEGA nach DELTA � 0 ALPHA OMEGA DELTA � Scheibe 3 von ALPHA nach OMEGA � 2 DELTA ALPHA OMEGA � 1 DELTA OMEGA ALPHA � 0 DELTA ALPHA OMEGA � Scheibe 1 von DELTA nach ALPHA � 0 OMEGA DELTA ALPHA � Scheibe 2 von DELTA nach OMEGA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA

ALPHA OMEGA DELTA

1

2

Page 18: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 18 -

Türme von Hanoi 3 ALPHA DELTA OMEGA � 2 ALPHA OMEGA DELTA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA � Scheibe 2 von ALPHA nach DELTA � 1 OMEGA ALPHA DELTA � 0 OMEGA DELTA ALPHA � Scheibe 1 von OMEGA nach DELTA � 0 ALPHA OMEGA DELTA � Scheibe 3 von ALPHA nach OMEGA � 2 DELTA ALPHA OMEGA � 1 DELTA OMEGA ALPHA � 0 DELTA ALPHA OMEGA � Scheibe 1 von DELTA nach ALPHA � 0 OMEGA DELTA ALPHA � Scheibe 2 von DELTA nach OMEGA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA

ALPHA OMEGA DELTA

1

2

Page 19: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 19 -

Türme von Hanoi 3 ALPHA DELTA OMEGA � 2 ALPHA OMEGA DELTA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA � Scheibe 2 von ALPHA nach DELTA � 1 OMEGA ALPHA DELTA � 0 OMEGA DELTA ALPHA � Scheibe 1 von OMEGA nach DELTA � 0 ALPHA OMEGA DELTA � Scheibe 3 von ALPHA nach OMEGA � 2 DELTA ALPHA OMEGA � 1 DELTA OMEGA ALPHA � 0 DELTA ALPHA OMEGA � Scheibe 1 von DELTA nach ALPHA � 0 OMEGA DELTA ALPHA � Scheibe 2 von DELTA nach OMEGA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA

ALPHA OMEGA DELTA

1

2

Page 20: 1. Grundelemente der Programmierung 2. Objekte, Klassen ... · II.3.1 Rekursive Algorithmen - 11 - Türme von Hanoi n Aufgabe: l bewege die Scheiben von ALPHA über DELTA nach OMEGA

II.3.1 Rekursive Algorithmen - 20 -

Türme von Hanoi 3 ALPHA DELTA OMEGA � 2 ALPHA OMEGA DELTA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA � Scheibe 2 von ALPHA nach DELTA � 1 OMEGA ALPHA DELTA � 0 OMEGA DELTA ALPHA � Scheibe 1 von OMEGA nach DELTA � 0 ALPHA OMEGA DELTA � Scheibe 3 von ALPHA nach OMEGA � 2 DELTA ALPHA OMEGA � 1 DELTA OMEGA ALPHA � 0 DELTA ALPHA OMEGA � Scheibe 1 von DELTA nach ALPHA � 0 OMEGA DELTA ALPHA � Scheibe 2 von DELTA nach OMEGA � 1 ALPHA DELTA OMEGA � 0 ALPHA OMEGA DELTA � Scheibe 1 von ALPHA nach OMEGA � 0 DELTA ALPHA OMEGA

ALPHA OMEGA DELTA

1

2

3