Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik Rekursive Funktionen in C © Timm Grams, Fulda, 13.08.2002 (korr.: 15.05.2008)"—  Präsentation transkript:

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

2 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.

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

4 Textinversion - ein C-Programm void ReadWrite(){ char x = getchar(); char x = getchar(); if (x!='\n'){ if (x!='\n'){ ReadWrite(); ReadWrite(); putchar(x); putchar(x); }} void main(){ printf("TEXTINVERSION (Eingabeende: CR)\n"); printf("TEXTINVERSION (Eingabeende: CR)\n"); ReadWrite(); ReadWrite(); }

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

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

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

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

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

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

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

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

13 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(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 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|

14 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(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 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|

15 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(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 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|

16 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(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 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|

17 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(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 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|

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

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

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

21 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. Programmspeicher:ReadWrite(){ char x = 3 getchar(); char x = 3 getchar(); 4 if (x!='\n') { 4 if (x!='\n') { 5 ReadWrite(); 5 ReadWrite(); 6 putchar(x); 6 putchar(x); }}main(){ 1 printf("TEXTI..."); 1 printf("TEXTI..."); 2 ReadWrite(); } 2 ReadWrite(); } Befehlszähler: STOP Stack: Eingabepuffer: Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABCCBA|

22 Rekursive Funktionen in C Ende der Demonstration


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

Ähnliche Präsentationen


Google-Anzeigen