Rekursive Funktionen in C Timm Grams Hochschule Fulda

  • Slides: 22
Download presentation
Rekursive Funktionen in C Timm Grams Hochschule Fulda Fachbereich Elektrotechnik und Informationstechnik © Timm

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

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 Textinversion erläutert.

Textinversion - Beschreibung Das Programm nimmt von der Tastatur ein Zeichenfolge entgegen und gibt

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

void Read. Write(){ char x = getchar(); if (x!='n'){ Read. Write(); putchar(x); } }

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

Programmablauf im Papiercomputer Der Befehlszähler beinhaltet die Nummer der auszuführenden Anweisung (hochgestellte Ziffern). Der

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

Programmablauf im Papiercomputer Als Ergebnis des ersten Befehls erscheint die Kopfzeile auf dem Bildschirm.

Programmablauf im Papiercomputer Als Ergebnis des ersten Befehls erscheint die Kopfzeile auf dem Bildschirm. Der Befehlszähler ist erhöht. Der Bediener hat den Text „ABC“ eingetippt und die Eingabetaste gedrückt. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } Befehlszähler: 2 Stack: Eingabepuffer: ´ABCn´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer Die Funktion Read. Write ist aufgerufen. Das Funktionssegment liegt auf dem

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

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } Befehlszähler: 4 Stack: RA(STOP) x(´A´) Eingabepuffer: ´BCn´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 1 -

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Befehlszähler auf die erste der If-Anweisungen gesetzt worden. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } Befehlszähler: 5 Stack: RA(STOP) x(´A´) Eingabepuffer: ´BCn´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer Die Read. Write-Funktion ist aufgerufen worden. Das Funktionssegment ist auf dem

Programmablauf im Papiercomputer Die Read. Write-Funktion ist aufgerufen worden. Das Funktionssegment ist auf dem Stack abgelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } Befehlszähler: 3 Stack: RA(6) x(? ) RA(STOP) x(´A´) Eingabepuffer: ´BCn´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } Befehlszähler: 4 Stack: RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´Cn´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 1 -

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Befehlszähler auf die erste der If-Anweisungen gesetzt worden. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } Befehlszähler: 5 Stack: RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´Cn´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer Das Funktionssegment ist auf dem Stack angelegt und der Befehlszähler steht

Programmablauf im Papiercomputer Das Funktionssegment ist auf dem Stack angelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } Befehlszähler: 3 Stack: RA(6) x(? ) RA(6) x(´B´) RA(STOP) x(´A´) Eingabepuffer: ´Cn´ Ausgabe (Bildschirm): TEXTINVERSION (Eingabeende: CR) ABC |

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } 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 -

Programmablauf im Papiercomputer Nach Auswertung der if-Bedingung - sie liefert den Wert 1 - ist der Befehlszähler auf die erste der If-Anweisungen gesetzt worden. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } 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

Programmablauf im Papiercomputer Der Funktionsdeskriptor ist auf dem Stack angelegt und der Befehlszähler steht auf dem ersten Befehl der Funktion. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } 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

Programmablauf im Papiercomputer Die Funktion getchar() hat das erste Zeichen dem Tastaturpuffer entnommen. Es ist der Variablen x zugewiesen worden. Programmspeicher: Read. Write(){ char x = 3 getchar(); 4 if (x!='n') { 5 Read. Write(); 6 putchar(x); } } main(){ 1 printf("TEXTI. . . "); 2 Read. Write(); } 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 -

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

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

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

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

Rekursive Funktionen in C Ende der Demonstration

Rekursive Funktionen in C Ende der Demonstration