Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Rekursion IFB Weiterbildungslehrgang X Informatik Kurs 2: Thema Rekursion 2. 12. 2005 Tobias Selinger.

Ähnliche Präsentationen


Präsentation zum Thema: "Rekursion IFB Weiterbildungslehrgang X Informatik Kurs 2: Thema Rekursion 2. 12. 2005 Tobias Selinger."—  Präsentation transkript:

1 Rekursion IFB Weiterbildungslehrgang X Informatik Kurs 2: Thema Rekursion Tobias Selinger

2 TS Rekursion 2Einleitung Was macht man mit einem großen Problem? Flugzeugsimulator-Programm ?

3 TS Rekursion 3 Modularisierung - Teile und herrsche Was macht man mit einem großen Problem? Flugzeugsimulator-Programm Benutzer- Oberfläche 3D-System Karten- datenbank Landschafts- generator Spiel- Steuerung Level-Editor in Teilprobleme zerlegen

4 TS Rekursion 4 Zerlegung in Teilprobleme? 4 ! = = 24 5 ! = = 120

5 TS Rekursion 5 Definition: rekursiv lösbar Ein Problem ist rekursiv lösbar, falls man es in Teilprobleme zerlegen kann, die alle ähnlich zum Gesamtproblem sind kleiner als das Gesamtproblem sind irgendwann direkt lösbar sind Beispiel: Zeichne diesen Busch! Ähnliche Teilprobleme ?

6 TS Rekursion 6 Busch: Teilprobleme Ein Problem ist rekursiv lösbar, falls man es in Teilprobleme zerlegen kann, die alle ähnlich zum Gesamtproblem sind kleiner als das Gesamtproblem sind irgendwann direkt lösbar sind Beispiel 1: Zeichne diesen Busch! Ähnliche Teilprobleme: Zeichne Teilbüsche ! Wie ??? rechter Teilbusch linker Teilbusch Level 1

7 TS Rekursion 7 Busch: Teilprobleme Ein Problem ist rekursiv lösbar, falls man es in Teilprobleme zerlegen kann, die alle ähnlich zum Gesamtproblem sind kleiner als das Gesamtproblem sind irgendwann direkt lösbar sind Beispiel 1: Zeichne diesen Busch! Ähnliche Teilprobleme: Zeichne Teilbüsche ! Wie ??? Ebenso... ! Teilbusch Teil- busch Teilbusch Teil- busch Level 1 Level 2

8 TS Rekursion 8 Busch: Bildungsgesetz Ein Problem ist rekursiv lösbar, falls man es in Teilprobleme zerlegen kann, die alle ähnlich zum Gesamtproblem sind kleiner als das Gesamtproblem sind irgendwann direkt lösbar sind Das rekursive Bildungsgesetz für einen Busch lautet also: rechter (Teil-)Busch linker (Teil-)Busch Zweig nach rechts Zweig nach links Busch =???

9 TS Rekursion 9 Busch: Bildungsgesetz Ein Problem ist rekursiv lösbar, falls man es in Teilprobleme zerlegen kann, die alle ähnlich zum Gesamtproblem sind kleiner als das Gesamtproblem sind irgendwann direkt lösbar sind Das rekursive Bildungsgesetz für einen Busch lautet also: Beachte: Endlos-Rekursion??? Busch =rechter Zweig + rechter (Teil)-Busch + linker Zweig + linker (Teil)-Busch rechter (Teil-)Busch linker (Teil-)Busch Zweig nach rechts Zweig nach links

10 TS Rekursion 10 Busch: Bildungsgesetz Ein Problem ist rekursiv lösbar, falls man es in Teilprobleme zerlegen kann, die alle ähnlich zum Gesamtproblem sind kleiner als das Gesamtproblem sind irgendwann direkt lösbar sind Das rekursive Bildungsgesetz für einen Busch lautet also: Beachte: Wenn ein Teilbusch klein genug ist, gilt er als abgeschlossen (ohne weitere Folgearbeit) ! Ansonsten müsste man endlos weiterzeichnen... Busch =rechter Zweig + rechter (Teil)-Busch + linker Zweig + linker (Teil)-Busch rechter (Teil-)Busch linker (Teil-)Busch Zweig nach rechts Zweig nach links

11 TS Rekursion 11 Busch: Programmierung rechter (Teil-)Busch linker (Teil-)Busch Zweig nach rechts Zweig nach links Programmierung der Grundstruktur: procedure busch(laenge: real); begin if laenge > 10 then with Form1.Turtle1 do begin turnright(20); forwd(laenge); back(laenge); turnleft(40); forwd(laenge); back(laenge); turnright(20); end; end; ??? ??? ??? Eintrittsbedingung

12 TS Rekursion 12 Busch: Programmierung rechter (Teil-)Busch linker (Teil-)Busch Zweig nach rechts Zweig nach links Programmierung der Grundstruktur: procedure busch(laenge: real); begin if laenge > 10 then with Form1.Turtle1 do begin turnright(20); forwd(laenge); back(laenge); turnleft(40); forwd(laenge); back(laenge); turnright(20); end; end; rechten Zweig zeichnen zurück und linken Zweig zeichnen zurück und geradeaus drehen (in Ausgangsposition!) Eintrittsbedingung

13 TS Rekursion 13 Busch: Programmierung Ergänzung der rekursiven Aufrufe: procedure busch(laenge: real); begin if laenge > 10 then with Form1.Turtle1 do begin turnright(20); forwd(laenge); ??? back(laenge); turnleft(40); forwd(laenge); ??? back(laenge); turnright(20); end; end; rechten Zweig zeichnen rechten Teilbusch zeichnen? zurück und linken Zweig zeichnen linken Teilbusch zeichnen? zurück und geradeaus drehen rechter (Teil-)Busch linker (Teil-)Busch Zweig nach rechts Zweig nach links Programmierung der Grundstruktur:

14 TS Rekursion 14 Busch: Programmierung procedure busch(laenge: real); begin if laenge > 10 then with Form1.Turtle1 do begin turnright(20); forwd(laenge); busch( ); back(laenge); turnleft(40); forwd(laenge); busch( ); back(laenge); turnright(20); end; end; rechten Zweig zeichnen rechten Teilbusch zeichnen zurück und linken Zweig zeichnen linken Teilbusch zeichnen zurück und geradeaus drehen rechter (Teil-)Busch linker (Teil-)Busch Zweig nach rechts Zweig nach links Ergänzung der rekursiven Aufrufe: Programmierung der Grundstruktur:

15 TS Rekursion 15 Busch: Programmierung procedure busch(laenge: real); begin if laenge > 10 then with Form1.Turtle1 do begin turnright(20); forwd(laenge); busch(laenge * 0.7); back(laenge); turnleft(40); forwd(laenge); busch(laenge * 0.7); back(laenge); turnright(20); end; end; rechten Zweig zeichnen rechten Teilbusch zeichnen zurück und linken Zweig zeichnen linken Teilbusch zeichnen zurück und geradeaus drehen rechter (Teil-)Busch linker (Teil-)Busch Zweig nach rechts Zweig nach links Ergänzung der rekursiven Aufrufe: Programmierung der Grundstruktur: Programm- Demo!

16 TS Rekursion 16 Busch: Aufbau der Levels Level 1

17 TS Rekursion 17 Busch: Aufbau der Levels Level 2

18 TS Rekursion 18 Busch: Aufbau der Levels Level 3

19 TS Rekursion 19 Busch: Aufbau der Levels Level ? Programm- Demo! Übungen!

20 TS Rekursion 20 Übungen:Entwickeln Sie zunächst das Grundmuster, danach die Einstiegspunkte für rekursive Aufrufe. Vergessen Sie nie die Eintritts-/Abbruchbedingung! Kopieren Sie das Delphi-Projekt Rekursion graphisch und bauen Sie Ihre Prozeduren dort ein! Testen Sie! a)spirale(laenge) erzeugt eine Spirale als geknickte Linie (Winkel jeweils 30°), deren Linienstücke immer kürzer werden. b)baum(laenge) ähnelt dem Busch, hat aber als Grundmuster einen Stamm mit zwei Knospen. Übungen: Spirale und Baum

21 TS Rekursion 21 Übungen: Kochkurve und Hutschnur c)koch(laenge) erzeugt die berühmte Kochkurve: Das mittlere Drittel einer Strecke wird durch zwei ebenso lange Dreieckseiten ersetzt, dies wird dann auf allen vier Teilstrecken durchgeführt, und wiederum auf deren Teilstrecken... d)hutschnur(laenge) ähnelt der Kochkurve, ersetzt das mittlere Drittel aber durch drei Quadratseiten, und setzt dieses Verfahren auf allen Teilstrecken fort.

22 TS Rekursion 22 Übungen für Spezialisten: Sierpinski und Drachenkurve e)sierpinski(laenge) erzeugt ein gleichseitiges Dreieck, in dessen Ecken halb so große Dreiecke sitzen, in deren Ecken wiederum... f)drache(laenge) erzeugt die berühmte Drachenkurve, die sich aus einem geknickten Papierstreifen ergibt: Einen langen Streifen durch Knicken sorgfältig halbieren, die beiden übereinanderliegenden Teilstreifen wieder Knicken und am Schluss den gesamten Streifen jeweils mit 90°-Knicks auseinanderfalten. Am besten macht man es einmal vor! (Tipp: Verwenden Sie zwei Parameter: drache(laenge, winkel), wobei der winkel die gewünschte Knickrichtung +/- 90° angibt!)

23 TS Rekursion 23 Beispiel 2:Die Fakultät einer Zahl: 4 ! = = 24 Rekursion??5 ! = = 120 Numerischer Einstieg: Fakultätsfunktion Test: 3 ! = ? 1 ! = ?

24 TS Rekursion 24 Beispiel 2:Die Fakultät einer Zahl: 4 ! = = 24 5 ! = = 120 Rekursion:5 ! = 5 4 ! Rekursive Formel: Test: 3 ! = 6 1 ! = 1 Fakultät: Bildungsgesetz n ! = ???

25 TS Rekursion 25 Beispiel 2:Die Fakultät einer Zahl: 4 ! = = 24 5 ! = = 120 Rekursion: 5 ! = 5 4 ! Rekursive Formel: Problem: Was ist n ! = n (n-1) ! Test: 3 ! = 6 1 ! = 1 Fakultät: Bildungsgesetz 1 ! = ? Rekursionsschritt

26 TS Rekursion 26 Beispiel 2:Die Fakultät einer Zahl: 4 ! = = 24 5 ! = = 120 Rekursion: 5 ! = 5 4 ! Rekursive Formel: Problem: Lösung: Für den Sonderfall n = 1 ist das Teilproblem direkt lösbar, d.h. bei n = 1 erfolgt kein rekursiver Aufruf mehr! Beachte:Jeder rekursive Prozess benötigt eine Rekursionbedingung und einen solchen Start- bzw. Endwert, sonst gingen die rekursiven Aufrufe ins Endlose! n ! = n (n-1) !, falls n > 1 ist Test: 3 ! = 6 1 ! = 1 Fakultät: Bildungsgesetz 1 ! = 1 Rekursionbedingung Rekursionsschritt Start-/Endwert Rollenspiel!

27 TS Rekursion 27 Beispiel 2:Die Fakultät einer Zahl: 5 ! = = ! = 5 4 ! 4 ! = ??? Fakultät: Berechnung mit rekursivem Abstieg... Phase des rekursivenAbstiegs (rekursive Aufrufe)

28 TS Rekursion 28 Beispiel 2:Die Fakultät einer Zahl: 5 ! = = ! = 5 4 ! 4 ! = 4 3 ! 3 ! = 3 2 ! 2 ! = 2 1 ! 1 ! =..... Fakultät: Berechnung mit rekursivem Abstieg... Phase des rekursivenAbstiegs (rekursive Aufrufe)

29 TS Rekursion 29 Beispiel 2:Die Fakultät einer Zahl: 5 ! = = ! = 5 4 ! 4 ! = 4 3 ! 3 ! = 3 2 ! 2 ! = 2 1 ! 1 ! = 1 Fakultät: Berechnung mit rekursivem Abstieg... Phase des rekursivenAbstiegs (rekursive Aufrufe)

30 TS Rekursion 30 Beispiel 2:Die Fakultät einer Zahl: 5 ! = = ! = 5 4 ! 4 ! = 4 3 ! 3 ! = 3 2 ! 2 ! = 2 1 ! 1 ! = 1 Fakultät:... und Aufstieg 2 1 Phase des rekursivenAbstiegs (rekursive Aufrufe) Phase des rekursivenAufstiegs (Zusammenbau)

31 TS Rekursion 31 Beispiel 2:Die Fakultät einer Zahl: 5 ! = = ! = 5 4 ! 4 ! = 4 3 ! 3 ! = 3 2 ! 2 ! = 2 1 ! 1 ! = 1 Fakultät:... und Aufstieg Phase des rekursivenAbstiegs (rekursive Aufrufe) Phase des rekursivenAufstiegs (Zusammenbau)

32 TS Rekursion 32 Beispiel 2:Die Fakultät einer Zahl: 5 ! = = ! = 5 4 ! 4 ! = 4 3 ! 3 ! = 3 2 ! 2 ! = 2 1 ! 1 ! = 1 Fakultät:... und Aufstieg Phase des rekursivenAbstiegs (rekursive Aufrufe) Phase des rekursivenAufstiegs (Zusammenbau)

33 TS Rekursion 33 Beispiel 2:Die Fakultät einer Zahl: 5 ! = = ! = 5 4! = 5 (4 3!) = 5 (4 (3 2!)) = 5 (4 (3 (2 1!))) = 5 (4 (3 (2 (1)))) = 5 (4 (3 (2))) = 5 (4 (6)) = 5 (24) = 120 Fakultät: Ab- und Aufstieg Phase des rekursivenAbstiegs (rekursive Aufrufe) Phase des rekursivenAufstiegs (Rückgabe und Zusammenbau der Ergebnisse)

34 TS Rekursion 34 Fibonacci (Bildungsgesetz?) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen

35 TS Rekursion 35 Fibonacci (Bildungsgesetz?) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 fib(...) =

36 TS Rekursion 36 Fibonacci (Bildungsgesetz?) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 fib(6) = = 8 = fib(5) + fib(4)

37 TS Rekursion 37 Fibonacci (Startproblem!) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 Bildungsgesetz: aktuelle Zahl = ??? fib(6) = = 8 = fib(5) + fib(4)

38 TS Rekursion 38 Fibonacci (Startproblem!) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 Bildungsgesetz: aktuelle Zahl = letzte Zahl + vorletzte Zahl fib(6) = = 8 = fib(5) + fib(4)

39 TS Rekursion 39 Fibonacci (Startproblem!) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 Bildungsgesetz: aktuelle Zahl = letzte Zahl + vorletzte Zahl Rekursive Formel: fib(n) = fib(... ) + fib(... ) fib(6) = = 8 = fib(5) + fib(4)

40 TS Rekursion 40 Fibonacci (Startproblem!) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 Bildungsgesetz: aktuelle Zahl = letzte Zahl + vorletzte Zahl Rekursive Formel: fib(n) = fib(n-1) + fib(n-2) Rekursions -Schritt fib(6) = = 8 = fib(5) + fib(4)

41 TS Rekursion 41 Fibonacci (Startproblem!) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 Bildungsgesetz: aktuelle Zahl = letzte Zahl + vorletzte Zahl Rekursive Formel: fib(n) = fib(n-1) + fib(n-2) Beachte Problemfall: fib(1) = fib(...) + fib(...) ??? Rekursions -Schritt fib(6) = = 8 = fib(5) + fib(4)

42 TS Rekursion 42 Fibonacci (Startproblem!) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 Bildungsgesetz: aktuelle Zahl = letzte Zahl + vorletzte Zahl Rekursive Formel: fib(n) = fib(n-1) + fib(n-2) Beachte Problemfall: fib(1) = fib(0) + fib(-1) ??? Endlos-Rekursion? Undefiniert? Abhilfe? Rekursions -Schritt fib(6) = = 8 = fib(5) + fib(4)

43 TS Rekursion 43 Fibonacci (rekursive Formel) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen fib(1) = 1 fib(2) = 1 fib(3) = 2 Bildungsgesetz: aktuelle Zahl = letzte Zahl + vorletzte Zahl Rekursive Formel: fib(n) = fib(n-1) + fib(n-2) Ausnahme: für n < 3 ist: fib(n) = 1 Rekursions-Start bzw. -Ende Rekursions -Schritt fib(6) = = 8 = fib(5) + fib(4)

44 TS Rekursion 44 Fibonacci (Funktions-Aufbau) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen Rekursive Formel: fib(n) = fib(n-1) + fib(n-2) Ausnahme: für n < 3 ist: fib(n) = 1 Aufgabe:Programmiere eine Funktion namens fib, die zur Eingabe n die zugehörige Fibonacci-Zahl liefert! function fib(n: integer): integer; begin... fib := end; Eingabe- parameter Typ des Rückgabewerts Aufbau der Funktion: Zuweisung des Rückgabewerts an den Funktionsnamen Funktions- Name

45 TS Rekursion 45 Fibonacci (Programmierung) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen Rekursive Formel: fib(n) = fib(n-1) + fib(n-2) Ausnahme: für n < 3 ist: fib(n) = 1 Aufgabe:Programmiere eine Funktion namens fib, die zur Eingabe n die zugehörige Fibonacci-Zahl liefert! function fib (n: integer): integer; begin if..... then else end; Rekursions- Anfang bzw. - Ende Rekursions -Schritt Rekursions- Bedingung

46 TS Rekursion 46 Fibonacci (Programmierung) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen Rekursive Formel: fib(n) = fib(n-1) + fib(n-2) Ausnahme: für n < 3 ist: fib(n) = 1 Aufgabe:Programmiere eine Funktion namens fib, die zur Eingabe n die zugehörige Fibonacci-Zahl liefert! function fib (n: integer): integer; begin if..... then fib := fib (n-1) + fib (n-2) else end; Rekursions- Anfang bzw. - Ende Rekursions -Schritt Rekursions- Bedingung Rekursions -Schritt rekursive Aufrufe

47 TS Rekursion 47 Fibonacci (Programmierung) Beispiel 3: Die Fibonacci-Folge beginnt mit den Zahlen Rekursive Formel: fib(n) = fib(n-1) + fib(n-2) Ausnahme: für n < 3 ist: fib(n) = 1 Aufgabe:Programmiere eine Funktion namens fib, die zur Eingabe n die zugehörige Fibonacci-Zahl liefert! function fib (n: integer): integer; begin if n > 2 then fib := fib (n-1) + fib (n-2) else fib := 1 end; Rekursions- Anfang bzw. - Ende Rekursions -Schritt Rekursions- Bedingung Rekursions -Schritt rekursive Aufrufe

48 TS Rekursion 48 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) ??? a := fib(6)

49 TS Rekursion 49 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) a := fib(6)

50 TS Rekursion 50 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) a := fib(6)

51 TS Rekursion 51 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6)......

52 TS Rekursion 52 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6)

53 TS Rekursion 53 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6) 1 2

54 TS Rekursion 54 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6)

55 TS Rekursion 55 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6) fib(2)+fib(1) 1 2

56 TS Rekursion 56 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6) fib(2)+fib(1) 1 2 5

57 TS Rekursion 57 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6) fib(2)+fib(1)

58 TS Rekursion 58 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6) fib(2)+fib(1) fib(3) + fib(2) fib(2)+fib(1) Beachte: Aufrufstruktur? Verzweigungsfaktor? Komplexität?

59 TS Rekursion 59 Fibonacci (Aufrufstruktur) Aufruf der Fibonacci-Funktion: function fib(n: integer): integer; begin if n > 2 then fib := fib(n-1) + fib(n-2) else fib := 1 end; fib(5) + fib(4) fib(4) + fib(3) fib(3)+fib(2) fib(2)+fib(1) a := fib(6) fib(2)+fib(1) fib(3) + fib(2) fib(2)+fib(1) Beachte: Durch den zweifachen rekursiven Aufruf von fib entsteht eine (unvollständige) Baumstruktur mit 2-facher Verzweigung! Eine Vergrößerung von n bedeutet daher fast doppelten Aufwand, d.h. die Komplexität liegt bei etwa 2 n. (asymptotisch: 1,618 n )

60 TS Rekursion 60 Aufgaben (numerisch) Aufgaben: Entwickeln und testen Sie Funktionen: a)fak zur rekursiven Berechnung der Fakultät einer Zahl b)summe_1_bis_n zur Berechnung von n (Tipp: Kopieren und ändern Sie fak entsprechend!) c)fib zur rekursiven Berechnung der Fibonaccizahl d)Bauen Sie bei fib einen Aufrufzähler (globale Variable! warum?) ein, der bei jedem Aufruf von fib inkrementiert wird! e)Zum Vergleich: Programmieren Sie fakiter und fibiter zur iterativen Berechnung von fak und fib, d.h. mit Schleifen anstatt Rekursion!

61 TS Rekursion 61 Aufgabe: Binomialkoeffizienten f)Eine Funktion mit zwei Eingabewerten: bin(n,k) dient zur Berechnung von Binomialkoeffizienten ( ) anhand des Pascalschen Dreiecks: n k ???

62 TS Rekursion 62 Aufgabe: Binomialkoeffizienten f)Eine Funktion mit zwei Eingabewerten: bin(n,k) dient zur Berechnung von Binomialkoeffizienten ( ) anhand des Pascalschen Dreiecks: n k

63 TS Rekursion 63 Aufgabe: Permutationen g)Buchstabenrätsel: ZUES = ??? Eine Prozedur soll systematisch alle Permutationen erzeugen! Strategie: perm(ZUES) Z + perm(UES) S + perm(ZUE) E + perm(ZUS) U + perm(ZES) ZU + perm(ES) ZS + perm(UE) ZE + perm(US) ZUE + perm(S) ZUS + perm(E) ZUESZUSE ZEU + perm(S) ZES + perm(U) ZEUSZESU ZSU + perm(E) ZSE + perm(U) ZSUEZSEU... Tipp: Verwenden Sie zwei Parameter : perm(kopf,rest : string) und den Startaufruf perm(, ZUES). restlicher Teil bereits permutierter Teil

64 TS Rekursion 64 Aufgabe: Ackermann-Funktion h)Ein Beispiel für verschachtelte Rekursion: Die Ackermann-Funktion hat 2 Eingabewerte x und y, und wächst extrem schnell! y+1, falls x = 0 a(x,y) = a(x-1,1), falls x 0 und y = 0 a(x-1, a(x, y-1)), sonst Berechne per Hand a(1,1) und a(2, 2). Programmiere und teste a ! (Für theoretische Informatiker: Die Ackermann-Funktion ist zwar berechenbar, aber nicht primitiv-rekursiv... )

65 TS Rekursion 65 Aufgabe: universelle Funktion i)Die universelle Funktion f (x, y, a) kann verschiedene Funktionen berechnen. x und y sind die beiden Eingabewerte, und mit a bestimmt man: a = 1:Addieren a = 2:Multiplizieren a = 3:Potenzieren a > 3:??? x + y, falls a = 1 f (x,y,a) = x, falls a 1 und y = 1 f (x, f (x, y-1, a), a-1), sonst Berechne per Hand f(4, 3, 2) und f( 2, 3, 3). Programmiere und teste f !

66 TS Rekursion 66 Aufgabe: Türme von Hanoi j)Bei den Türmen von Hanoi muss ein Stapel von goldenen Scheiben von einem Startplatz auf einen Zielplatz bewegt werden. Zum Manövrieren gibt es noch einen Ablageplatz, denn es darf niemals eine größere auf eine kleinere Scheibe gelegt werden. Suchen Sie zunächst das rekursive Prinzip, um das Problem Bewege einen Turm der Höhe n auf ein kleineres Problem zu reduzieren! Entwickeln Sie dann eine rekursive Prozedur hanoi(hoehe, von, nach: integer), die eine Ausgabe wie z.B. nebenstehend erzeugt! (Ein praktischer Trick: = 6, d.h. die Formel für eine Platznummer lautet immer: 6 – die beiden anderen Platznummern. Hilft das ?!) Start (1)Ablage (2)Ziel (3)

67 TS Rekursion 67 Sammlung rekursiver Probleme Eine kleine Sammlung rekursiv lösbarer Probleme: Numerisch:Fakultät, Summe-1-bis-n, Potenz, Fibonacci, Binomialkoeffizienten (Pascalsches Dreieck), universelle Funktion, Ackermann Graphisch:Spirale, Busch, Baum, Kochkurve (Schneeflocke), Hutschnur, Drachenkurve (Papierfaltung), Sierpinski-Dreieck/-Quadrat, Peano-Kurve, Cantor-Staub (zerstückelte Strecke) Textuell:Spiegelung, Permutationen (Buchstabenrätsel), Formale Sprache (Erzeugung anhand Grammatik) Spiel:Zahlenraten, Türme von Hanoi Backtracking:Labyrinth, Acht-Damen- / Springer-Problem, Solitaire (Nimm-Spiel), Spielstrategien Suchen und Sortieren: binäre Suche, Quicksort, Mergesort

68 TS Rekursion 68 Methodische Zugänge Problemanalyse:Zerlegung in ähnliche Teilaufgaben Code-orientiert: a) Was tut dieses Programm? b) Code mit Auskunftsfunktion: bei jedem Aufruf wird dieser inkl. aktueller Parameter ausgegeben c) Einbau eines Aufruf-Zählers (globale Variable) Gegenständlich:verschachtelte Kartons oder Matrioschkas (im Innern liegt ein Schatz: nacheinander alle öffnen und danach alle wieder schließen), Papierstreifen falten (Faltrichtung beachten!) Rollenspiel:Für jeden Aufruf kommt ein weiterer Spieler auf die Bühne, der seine Arbeit demonstriert und ggf. weitere Spieler aufruft. Evtl. Tafelprotokoll. Hilfe: Vorbereitete Aufruf-/Aufgabenzettel. Visualisierungen: a) Aufrufstruktur mit rekursivem Ab- und Aufstieg b) Entwicklung des Aufruf-Stapels (stacks): Aufbau und Abbau (dynamisches Tafelbild)

69 TS Rekursion 69 Rekursion versus Iteration: Bsp. Fakultät function fak(n: integer): integer; var f, i: integer; begin f := 1; for i := 2 to n do f := f i; fak := f; end; function fak(n: integer): integer; begin if n > 1 then fak := n fak(n-1) else fak := 1; end; rekursiviterativ Benötigt werden hier zwei Variablen: i als Laufvariable für die Schleife, und f als Variable für das Zwischenergebnis, da die Funktionsvariable fak nur auf der linken Seite einer Zuweisung benutzt werden darf! (rechts: rekursiver Aufruf!!) Benötigt wird intern ein Stack, um die unfertigen Aufrufe zu speichern.

70 TS Rekursion 70 Vor- und Nachteile von Rekursion Rekursion – pro und contra: +mächtige Methode der Problemzerlegung +elegante deklarative Formulierung der Lösung +flexibel bezüglich der Problemgröße (keine festgelegten Schleifenanzahlen, z.B. bei Permutationen, n-Damen) -nicht sofort zu durchschauen -evtl. unnötig hoher Zeitbedarf (exponentielle Komplexität bei Mehrfachrekursion) (wiederholtes Berechnen von Zwischenergebnissen, z.B. bei fib ) (interner Verwaltungsaufwand: Stack mit begrenzter Größe)

71 TS Rekursion 71 Literaturverzeichnis und Links Quicksort:Baumann: Informatik für die Sekundarstufe II, Band 2 MUI-Sprache (MU-Problem):Hofstadter: Gödel, Escher, Bach (dtv 1991) Rekursion ETH:http://www.ite.ethz.ch/education/id1/vortraege/rekursion.pdfhttp://www.ite.ethz.ch/education/id1/vortraege/rekursion.pdf Downloads (Word, PDF) zu "Rekursives Programmieren":http://educeth.ethz.ch/informatik/leitprog/rekursionhttp://educeth.ethz.ch/informatik/leitprog/rekursion Backtracking anschaulich:http://educeth.ethz.ch/informatik/vortraege/backtrackinghttp://educeth.ethz.ch/informatik/vortraege/backtracking Über Fragen, Hinweise, Korrekturen würde ich mich freuen:


Herunterladen ppt "Rekursion IFB Weiterbildungslehrgang X Informatik Kurs 2: Thema Rekursion 2. 12. 2005 Tobias Selinger."

Ähnliche Präsentationen


Google-Anzeigen