Praktische Informatik I – Der Imperative Kern Einführung Rekursion
Prof. Dr. Stefan Edelkamp
Institut für Künstliche Intelligenz
Technologie-Zentrum für Informatik und Informationstechnik (TZI) Am Fallturm 1, 28359 Bremen
+49-(0)421-218-64007 www.tzi.de/~edelkamp
Outline
1 Willkommen in Rekursien
2 Achtung Rekursion!
3 Fraktale
4 Rekursion auf Zahlen
5 Rekursion auf Strings
Zielstellung der Einheit
Sie sollen das PrinzipRekursionverstehen und die Mächtigkeit sowie Eleganz der Methode in der Informatik erkennen. Dabei werden die intuitive Problemlösung, derenSelbstbezüglichkeit sowie dieAufteilung in Teilproblemevermittelt.
Sie lernen,wie häufig Rekursion in der Informatik auftritt.
Der Unterschied zwischenrekursivenunditerativenProgrammen wird Ihnen deutlich.
Sie setzen ihre Erkenntnisse inlauffähige Programmeum.
Als längerfristiges Ziel verstehen Sie Rekursion als wesentlichen Bestandteil einer modernen Programmierspracheund wenden rekursive Problemlösungenbevorzugt an.
Sie entwickeln ein inneres Verständnis von derKomplexitäteines Programms, die sich in derAnzahl der rekursiven Aufrufe
niederschlägt.
Outline
1 Willkommen in Rekursien
2 Achtung Rekursion!
3 Fraktale
4 Rekursion auf Zahlen
5 Rekursion auf Strings
Selbstbezüge
Rekursive Definitionen sind z.B.
GNU: Abkürzung vonGNU’s not UNIX oderMise en abymeIllustrationen, z.B.
Weitere Beispiel sind Endloslieder und Geschichten, wie Ja, Ja der alte Oberförster, Hugo war sein Name . . . ;
Illustrationen von M.C. Escher (s. Bild); Bücher, wieDie Unendliche Geschichte; Filme, wieMatrix,. . .
Outline
1 Willkommen in Rekursien
2 Achtung Rekursion!
3 Fraktale
4 Rekursion auf Zahlen
5 Rekursion auf Strings
Immerschöne Bilder
Fraktale sind Beispiele von rekursiven Konstruktionen, ein Beispiel ist die sogennannteJulia-Menge
Wie wurden dieDarstellungen der Rekursionin diesen zwei Bildern (vermutlich) verwirklicht?
Apfelmännchen
DieMandelbrotmengeist eine Menge von Punkten, deren iterierte Auswertung einer Berechnungsvorschrift nicht gegen unendlich läuft.
NachBenoit Mandelbrotist es eine Menge vonkomplexe Zahlenc, für die die Folgezn+1=zn2−c mitz0=0konvergiert
Mit der Darstellung von komplexen Zahlen durchReal- und
Imaginärteil(r0,i0) = (0,0)und geeignetem(cr,ci)verweist sie auf die wiederholte Berechnungvonrn+1=rn2−in2+cr undin+1=2rnin+ci. Das Programm 1 ist nicht rekursiv, sonderniterativ– die Definition der Menge ist jedoch rekursiv!
Es ist erstaunlich, wie vielwenig Zeilen Programmtextbewirken können.
Programm 1:Programm zur Darstellung der Mandelbrot-Menge.
public classMandelbrot {
public voidfractal() { intk= 2;
doubley=−16;// x,y are coordinates
String magic=newString(" .:−;!/>)|iIHO∗+");
while(y++<15) {// r,i are updated String row=newString();
for(doublex=0;x<84;x++) { row=row+magic.charAt(k&15);
k= 0;
doubleimag= 0.0;
doublereal= 0.0;
doublej;
do{
j=real∗real−imag∗imag−2 +x/25.0;
imag= 2∗real∗imag+y/10;
real=j;
}while(j∗j+imag∗imag<11 &&k++<111);
}
System.out.println(row);
} } }
Outline
1 Willkommen in Rekursien
2 Achtung Rekursion!
3 Fraktale
4 Rekursion auf Zahlen
5 Rekursion auf Strings
Gemeinsames Sparen
Anstattx =2k Euro alleine zu sparen, empfiehlt sich rekursiv zwei Freunde zu bemühen, die den halben Geldbetrag sparen.
Das Programm 2 folgt einem mächtigen Designprinzip für Algorithmen demDivide-and-Conquer– zu Deutsch:Teile-und-Herrsche
Programm 2:Teilen und Herrschen.
public classCollectMoney {
inttotal;
voiddac(inta) {// recursive collect function if(a<=1)// if less than one Euro left total+=a;// increase total amount else{dac(a/2);dac(a/2);}// recursive calls }
intcollect(inta) { total= 0;
dac(a);
returntotal;
} }
Outline
1 Willkommen in Rekursien
2 Achtung Rekursion!
3 Fraktale
4 Rekursion auf Zahlen
5 Rekursion auf Strings
Rückwärtsbotschaften und Palindrome
Rekursion wirkt nicht nur auf Zahlen, sondern auch auf Zeichenketten!
Das Spiegeln einerZeichenkettedurch das Prinzip der Rekursion in Programm 3 liefert für die Eingabe hallo. die Ausgabe .ollah
Nutzen Sie Namen aus Ihrem Freundeskreis, um sie als Rückwärtsbotschaftzu lesen.
Spiegeln Sie ein gespiegeltes Wort
Musikalische Rückwärtsbotschaften sind sehr beliebt, z.B. im Lied von QueenAnother One Bites the Dust
Durch marginale Erweiterung des Programms 3 entsteht einPalindrom
Dadurch lautet die Ausgabe hallo.ollah
Programm 3:Umkehrung und Palindromerstellung einer Zeichenkette.
public classReversal {
/∗∗
∗Printing a input string in reverse order
∗@param s string to be considered
∗@param i current index position (start with 0)
∗/
public voidreverse(String s,inti) { if(s.charAt(i) !=’.’)
reverse(s,i+1);
System.out.print(s.charAt(i));
} /∗∗
∗Printing a input string as palindrome
∗@param s string to be considered
∗@param i current index position (start with 0)
∗/
public voidpalindrome(String s,inti) { System.out.print(s.charAt(i));
if(s.charAt(i) !=’.’) palindrome(s,i+1);
System.out.print(s.charAt(i));
Hintergrund
Zum Test aufsyntaktische Korrektheitwerden für den Compiler in vielen Programmiersprachen rekursive Regeln festgelegt.
Merke:
Rekursion entsteht durch Selbstbezug. Für die Endlichkeit sind Verkleinerungen des Problems sowie Abbruchkriterien notwendig.
Rekursion ist der Prozess, in dem eine Funktion sich selbst als Teilfunktion aufruft. Dies erlaubt, die Funktion mehrfach zu wiederholen. Funktionen, die Rekursion beinhalten, werden rekursiv genannt.
Rekursion ist eine effektive Methode, da sie üblicherweise wenig Programmtext erfordert. Allerdings muss sie vorsichtig
implementiert werden, da sie sonst zu viele Aufrufe tätigt und nicht endet.
Diskussion
Was ist der Unterschied zwischen unendlich und rekursiv?
Warum gelten Fraktale als rekursiv, obwohl Programme keinen rekursiven Aufruf tätigen?
Wie könnten Sie mit einem Programm ein Wort auf Palindromeigenschaft prüfen?