Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Eine Einführung in die Programmiersprache C und die Grundlagen ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
25 Rekursion<br />
Rekursion bedeutet, dass sich e<strong>in</strong> Programm selbst aufruft. Viele Probleme lassen sich sehr elegant<br />
rekursiv Lösen, <strong>in</strong>sbesondere alle, <strong>die</strong> sich auf e<strong>in</strong>en vorgängig zu bestimmenden Wert beziehen.<br />
E<strong>in</strong> bekanntes, wenn auch eher s<strong>in</strong>nloses Beispiel ist das Berechnen der Fakultät nach der Rekursionsformel<br />
n! = n * (n-1)! <strong>und</strong> der Anfangsbed<strong>in</strong>gung 0! = 1.Dies würde wie folgt implementiert<br />
werden:<br />
<strong>in</strong>t Fakultaet(<strong>in</strong>t n)<br />
{<br />
if (n > 0) {<br />
return n*Fakultaet(n-1); /* Rekursiver Aufruf */<br />
}else {<br />
return 1;<br />
}<br />
}<br />
Allerd<strong>in</strong>gs ist <strong>in</strong> <strong>die</strong>sem Fall e<strong>in</strong>e Iteration (Schlaufe) e<strong>in</strong>deutig <strong>die</strong> bessere Lösung.<br />
Achtung: <strong>E<strong>in</strong>e</strong> Rekursion kann sehr viel Stack-Speicher benötigen, <strong>und</strong> bei Systemen mit wenig<br />
Stackspeicher zum Programmabsturz führen. Iterative Ansätze s<strong>in</strong>d normalerweise (Geschw<strong>in</strong>digkeits-)<br />
Effizienter als Rekursionen, Rekursionen s<strong>in</strong>d dagegen oft e<strong>in</strong>facher zu Implementieren <strong>und</strong><br />
zu Verstehen.<br />
Jede Rekursion kann mit dem entsprechenden Aufwand <strong>in</strong> e<strong>in</strong>e Iteration umgewandelt werden. In<br />
sicherheitskritischen Anwendungen (z. B. Autopilot) sollte auf Rekursion verzichtet werden.<br />
<strong>E<strong>in</strong>e</strong> Rekursion muss e<strong>in</strong>e garantierte Abbruchbed<strong>in</strong>gung besitzen, damit sie e<strong>in</strong> Ende f<strong>in</strong>det <strong>und</strong><br />
nicht ewig läuft (Und somit garantiert abstürzt).<br />
<strong>E<strong>in</strong>e</strong> Rekursion ist im Gegensatz zu e<strong>in</strong>er Schlaufe durch den verfügbaren Stack-Speicher limitiert.<br />
Wenn e<strong>in</strong>e Rekursion länger läuft als Speicher zur Verfügung steht, stürzt das Programm unweigerlich<br />
ab.<br />
E<strong>in</strong> weiteres Beispiel für e<strong>in</strong>e Rekursion ist <strong>die</strong> Ausgabe e<strong>in</strong>er Zahl. Die <strong>E<strong>in</strong>e</strong>rstelle e<strong>in</strong>er Zahl kann<br />
mit der Modulo-Operation sehr e<strong>in</strong>fach bestimmt werden, jedoch müssen zuvor <strong>die</strong> übrigen Ziffern<br />
der Zahl ausgegeben werden. Also wenn man 4285 Ausgeben will ergibt sich folgender Ablauf:<br />
Ablauf<br />
4285 muss noch ausgegeben werden<br />
5 ist <strong>die</strong> <strong>E<strong>in</strong>e</strong>rstelle, 428 muss noch ausgegeben werden<br />
8 ist nun <strong>die</strong> <strong>E<strong>in</strong>e</strong>rstelle, 42 muss noch ausgegeben werden<br />
2 ist nun <strong>die</strong> <strong>E<strong>in</strong>e</strong>rstelle, 4 muss noch ausgegeben werden<br />
4 ist nun <strong>die</strong> <strong>E<strong>in</strong>e</strong>rstelle, ke<strong>in</strong>e weiteren Ausgaben nötig<br />
4 ausgeben 4<br />
2 ausgeben 42<br />
8 ausgeben 428<br />
5 ausgeben 4285<br />
Die E<strong>in</strong>rückung entspricht<br />
der Verschachtelung der<br />
rekursiven Aufrufe<br />
Code<br />
Aufgabe 25.1:<br />
Schreiben Sie e<strong>in</strong> Programm, das e<strong>in</strong>e Zeile e<strong>in</strong>liest <strong>und</strong> umgekehrt wieder ausgibt. Verwenden Sie<br />
dazu Rekursion. (Tip: Lesen Sie <strong>die</strong> Zeile zeichenweise [getchar()]).<br />
E<strong>in</strong>gabe: Hallo Welt<br />
Ausgabe: tleW ollaH<br />
void Pr<strong>in</strong>tZahl(<strong>in</strong>t x)<br />
{<br />
if (x > 0) {<br />
Pr<strong>in</strong>tZahl(x/10);<br />
putchar('0' + x % 10);<br />
}<br />
}<br />
<strong>in</strong>t ma<strong>in</strong> (<strong>in</strong>t c, char *a[])<br />
{<br />
Pr<strong>in</strong>tZahl(4285);<br />
return 0;<br />
}<br />
Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 96/147