06.10.2013 Aufrufe

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

Eine Einführung in die Programmiersprache C und ... - C /C++ Ecke

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<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 Code<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 />

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 />

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 Ausgabe: tleW ollaH<br />

Gedruckt am 11.09.2008 13:04:00 Letzte Änderung am: 11. September 2008 Version 2.4, I. Oesch 96/147

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!