Java Reference
In-Depth Information
beitung bei einer Rekursion nach dem FILO-Prinzip. FILO steht für „irst in last out“. Das
klingt jetzt vielleicht etwas seltsam, aber wenn Sie an einen realen Kartenstapel denken,
wird die Sache leicht klar. Stellen Sie sich vor, Sie legen Karten einzeln auf einem Karten-
stapel aufeinander. Wenn Sie die Karten wieder einzeln wegnehmen, nehmen Sie sie von
oben weg, bis die letzte Karte entnommen wurde und der Stapel weg ist. Die Karte, die als
Erstes (irst in) auf den Stapel gelegt wurde, ist also vor dem „Abarbeiten“ des Stapels ganz
unten und wird als letzte Karte verarbeitet (last out).
Nun ist die FILO-Reihenfolge bei Rekursion nicht immer von Bedeutung. Im einfachen Fall
rut sich eine Funktion im Laufe der Abarbeitung bloß selbst wieder auf und macht irgend-
etwas, was vom vorherigen Aufruf nicht abhängt. Aber wenn ein Aufruf von dem vorherigen
abhängt, dann ist die Reihenfolge natürlich massiv von Bedeutung. Gerade wenn eine
rekursive Funktion einen Rückgabewert liefert, ist das FILO-Prinzip wichtig. Das nachfol-
gende Listing zeigt sowohl die einfache Situation von unabhängigen Aufrufen als auch
einen klassischen Algorithmus für Rekursion, der mit Rückgabewerten der rekursiven
Funktion arbeitet - die Fakultätsberechnung. Beispiel (kap5_27.html):
Listing 5.51■ Die Basis-Webseite
...
<script type="text/javascript" src="lib/js/kap5_27.js"></script>
</head>
<body>
<h1>Selbstaufrufe in Funktionen</h1>
<a href="javascript:fkt()">Einfache Rekursion</a>
<br /><a href="javascript:alert(fak(5))">5!</a>
</body>
</html>
In dem Beispiel sehen Sie die Referenz auf eine externe JavaScript-Datei, in der zwei rekur-
sive Funktionen deklariert werden. Beide werden über Inline-Referenzen aufgerufen. Dabei
wird für den Aufruf der Funktion fak() der Rückgabewert über alert() in der Inline-Refe-
renz ausgegeben. So etwas macht man heutzutage nicht mehr mit einer Inline-Referenz.
Betrachten wir die JavaScript-Datei kap5_27.js:
Listing 5.52■ Rekursive Aufrufe
var i;
function fkt() {
i = 0;
rekFkt();
alert(i)
}
function rekFkt() {
i += Math.random();
if (i < 2) rekFkt() ;
}
function fak(n) {
if (n == 0) {
return 1;
} else {
return n * fak(n - 1) ;
}
}
 
Search WWH ::




Custom Search