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

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

Embed Size (px)

Citation preview

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

Timm GramsTimm Grams

Hochschule FuldaHochschule Fulda

Fachbereich Elektrotechnik und Fachbereich Elektrotechnik und InformationstechnikInformationstechnik

Rekursive Funktionen in Rekursive Funktionen in CC

© Timm Grams, Fulda, 13.08.2002 (korr.: © Timm Grams, Fulda, 13.08.2002 (korr.: 15.05.2008)15.05.2008)

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

Begriffe und deren Begriffe und deren BedeutungBedeutungDer Der GültigkeitsbereichGültigkeitsbereich einer Funktion einer Funktion erstreckt sich vom Punkt, wo ihr Name erstreckt sich vom Punkt, wo ihr Name deklariert ist, bis ans Ende der deklariert ist, bis ans Ende der Compilierungseinheit (Datei).Compilierungseinheit (Datei).

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

Funktionen, die sich selbst aufrufen, heißen Funktionen, die sich selbst aufrufen, heißen rekursivrekursiv. Das kann auch auf Umwegen über . Das kann auch auf Umwegen über andere Funktionen, also indirekt, passieren.andere Funktionen, also indirekt, passieren.

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

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

TextinversionTextinversion - Beschreibung - Beschreibung

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

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

TextinversioTextinversion n - ein C-- ein C-ProgrammProgramm

void ReadWrite(){void ReadWrite(){

char x = getchar();char x = getchar();

if (x!='\n'){if (x!='\n'){

ReadWrite();ReadWrite();

putchar(x);putchar(x);

}}

}}

void main(){void main(){

printf("TEXTINVERSION (Eingabeende: CR)\n");printf("TEXTINVERSION (Eingabeende: CR)\n");

ReadWrite();ReadWrite();

}

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 1 1

Stack:Stack:

Eingabepuffer:Eingabepuffer:

Ausgabe (Bildschirm):Ausgabe (Bildschirm):||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 2 2

Stack:Stack:

Eingabepuffer: Eingabepuffer: ´ABC\n´´ABC\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 3 3

Stack:Stack:

RA(STOP) x(?)RA(STOP) x(?)

Eingabepuffer: Eingabepuffer: ´ABC\n´´ABC\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 4 4

Stack:Stack:

RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´BC\n´´BC\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 5 5

Stack:Stack:

RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´BC\n´´BC\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 3 3

Stack:Stack:

RA(6) x(?)RA(6) x(?)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´BC\n´´BC\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 4 4

Stack:Stack:

RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´C\n´´C\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 5 5

Stack:Stack:

RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´C\n´´C\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 3 3

Stack:Stack:

RA(6) x(?)RA(6) x(?)RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´C\n´´C\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 4 4

Stack:Stack:

RA(6) x(´C´)RA(6) x(´C´)RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´\n´´\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 5 5

Stack:Stack:

RA(6) x(´C´)RA(6) x(´C´)RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´\n´´\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 3 3

Stack:Stack:RA(6) x(?)RA(6) x(?)RA(6) x(´C´)RA(6) x(´C´)RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer: Eingabepuffer: ´\n´´\n´

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 4 4

Stack:Stack:RA(6) x(´\n´)RA(6) x(´\n´)RA(6) x(´C´)RA(6) x(´C´)RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer:Eingabepuffer:

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 6 6

Stack:Stack:

RA(6) x(´C´)RA(6) x(´C´)RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer:Eingabepuffer:

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABC||

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 6 6

Stack:Stack:

RA(6) x(´B´)RA(6) x(´B´)RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer:Eingabepuffer:

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABCC|C|

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

Programmspeicher:Programmspeicher:

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: 6 6

Stack:Stack:

RA(STOP) x(´A´)RA(STOP) x(´A´)

Eingabepuffer:Eingabepuffer:

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABCCB|CB|

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

Programmablauf im PapiercomputerProgrammablauf im Papiercomputer

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

ReadWrite(){ReadWrite(){

char x = char x = 33getchar();getchar();

44if (x!='\n') {if (x!='\n') {

55ReadWrite();ReadWrite();

66putchar(x);putchar(x);

}}

}}

main(){main(){

11printf("TEXTI...");printf("TEXTI...");

22ReadWrite();ReadWrite();}}

Befehlszähler:Befehlszähler: STOP STOP

Stack:Stack:

Eingabepuffer:Eingabepuffer:

Ausgabe (Bildschirm):Ausgabe (Bildschirm):TEXTINVERSION (Eingabeende: CR)TEXTINVERSION (Eingabeende: CR)ABCABCCBA|CBA|

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

Rekursive Funktionen in CRekursive Funktionen in C

Ende der DemonstrationEnde der Demonstration