Rekursive Funktionen in C Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik © Timm Grams, Fulda, 13.08.2002 (korr.: 15.05.2008)

Download Report

Transcript Rekursive Funktionen in C Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik © Timm Grams, Fulda, 13.08.2002 (korr.: 15.05.2008)

Rekursive Funktionen in C

Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik © Timm Grams, Fulda, 13.08.2002 (korr.: 15.05.2008)

Begriffe und deren Bedeutung

Der

Gültigkeitsbereich

einer Funktion erstreckt sich vom Punkt, wo ihr Name deklariert ist, bis ans Ende der Compilierungseinheit (Datei).

Es ist zulässig, eine Funktion bereits im Anweisungsteil der Funktion selbst aufzurufen.

Funktionen, die sich selbst aufrufen, heißen

rekursiv

. Das kann auch auf Umwegen über andere Funktionen, also indirekt, passieren.

Die Rekursion wird am C-Programm für Textinver sion erläutert.

Textinversion

- Beschreibung Das Programm nimmt von der Tastatur ein Zeichenfolge entgegen und gibt sie in umgekehrter Reihenfolge wieder aus.

void ReadWrite(){ char x = getchar(); if (x!='\n'){ ReadWrite(); putchar(x); } }

Textinversion

- ein C-Programm

void main(){ printf("TEXTINVERSION (Eingabeende: CR)\n"); ReadWrite(); }

Programmablauf im Papiercomputer

Der Befehlszähler beinhaltet die Nummer der auszuführenden Anweisung (hochgestellte Ziffern). Der Stack ist anfangs leer. Der Cursor des Ausgabebildschirms (senkrechter Strich) steht auf der ersten Position.

Befehlszähler: 1 Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Stack: Eingabepuffer: Ausgabe (Bildschirm): |

Programmablauf im Papiercomputer

Als Ergebnis des ersten Befehls erscheint die Kopfzeile auf dem Bild schirm. Der Befehlszähler ist erhöht. Der Bediener hat den Text „ABC“ eingetippt und die Eingabetaste gedrückt.

Befehlszähler: 2 Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Stack: Eingabepuffer: ´ABC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Die Funktion ReadWrite ist aufgerufen. Das Funktionssegment liegt auf dem Stack: Rücksprungadresse RA und lokale Variable x. In Klammern stehen die aktuellen Werte der Variablen. x ist vorerst noch undefiniert.

Befehlszähler: 3 Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Stack: RA(STOP) x(?) Eingabepuffer: ´ABC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 4 Stack: RA(STOP) x(´A´) Eingabepuffer: ´BC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Be fehlszähler auf die erste der If-Anweisungen gesetzt worden.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 5 Stack: RA(STOP) x(´A´) Eingabepuffer: ´BC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Die ReadWrite-Funktion ist aufgerufen worden. Das Funktionssegment ist auf dem Stack abgelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion.

Befehlszähler: 3 Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Stack: RA(6) x(?) RA(STOP) x(´A´) Eingabepuffer: ´BC\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 4 Stack: RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´C\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Be fehlszähler auf die erste der If-Anweisungen gesetzt worden.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 5 Stack: RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´C\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Das Funktionssegment ist auf dem Stack angelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 3 Stack: RA(6) x(?) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´C\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 4 Stack: RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Be fehlszähler auf die erste der If-Anweisungen gesetzt worden.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 5 Stack: RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Der Funktionsdeskriptor ist auf dem Stack angelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 3 Stack: RA(6) x(?) RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´\n´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden.

Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Befehlszähler: 4 Stack: RA(6) x(´\n´) RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Nach Auswertung der if-Bedingung - sie liefert den Wert 0 - ist die Funktion beendet. Der Befehlszähler ist auf die Rücksprungadresse gesetzt worden. Der Stack-Eintrag der Funktion ist gelöscht.

Befehlszähler: 6 Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Stack: RA(6) x(´C´) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer

Die Funktion putchar(x) ist ausgeführt, die Funktion ist damit beendet. Der Befehlszähler ist auf die Rücksprungadresse gesetzt worden. Der Stack-Eintrag der Funktion ist gelöscht.

Befehlszähler: 6 Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Stack: RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC C|

Programmablauf im Papiercomputer

Die Funktion putchar(x) ist ausgeführt, die Funktion ist damit beendet. Der Befehlszähler ist auf die Rücksprungadresse gesetzt worden. Der Stack-Eintrag der Funktion ist gelöscht.

Befehlszähler: 6 Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Stack: RA(STOP) x(´A´) Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC CB|

Programmablauf im Papiercomputer

Die Funktion putchar(x) ist ausgeführt, die Funktion ist damit beendet. Der Befehlszähler ist auf die Rücksprungadresse gesetzt worden. Der Stack-Eintrag der Funktion ist gelöscht. Das Programm ist beendet.

Befehlszähler: STOP Programmspeicher: ReadWrite(){ char x = 3 getchar(); 4 if (x!='\n') { 5 ReadWrite(); 6 putchar(x); } } main(){ 1 printf("TEXTI..."); } 2 ReadWrite(); Stack: Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC CBA|

Rekursive Funktionen in C Ende der Demonstration