PHP-Lektionen – Lektion 9 – Rekursion
Im letzten Unterricht haben wir die Verwendung von Funktionen in PHP behandelt. Jetzt tauchen wir noch etwas tiefer in deren Verwendung ein. Bisher haben wir Funktionen dieser Art betrachtet:
<?php function myFunction(){ // Funktionsdefinition } $x = myFunction(); // Funktionsaufruf ?>
Aber was passiert, wenn eine Funktion sich selbst innerhalb ihres Körpers aufruft?
<?php function myFunction(){ $x = myFunction(); ... return $x; } $y = myFunction();
Dieser Aufruf einer Funktion im Körper derselben Funktion nennt sich Rekursion. Theoretisch klingt das recht kompliziert, aber in der Praxis ist es viel einfacher.
Lassen Sie uns eine Funktion zum Berechnen der Potenz eines Zahl erstellen. Aus dem Algebraunterricht wissen Sie sicher, dass die n-te Potenz einer Zahl bedeutet, diese Zahl n-mal mit sich selbst zu multiplizieren. In PHP sieht das so aus:
<?php function myDegree($x, $n){ if($n == 0){ return 1; } if($n < 0){ return myDegree(1/$x, -$n); // -$n bedeutet Umkehr des Vorzeichens von negativ zu positiv } return $x * myDegree($x, $n-1); // Funktionsaufruf innerhalb der Funktion } $y = myDegree(2, -4); // allererster Funktionsaufruf print $y; ?>
Schauen wir uns diese Funktion im Detail an. Zunächst gilt: Nach einer return-Zeile wird die Funktion nicht weiter ausgeführt, sondern der angegebene Wert zurückgegeben.
Die erste Konstruktion if($n == 0) – wenn unser Exponent 0 ist, wird 1 zurückgegeben. Das ist klar, denn jede Zahl hoch 0 ist 1. Weiter: if($n < 0) – wenn wir einen negativen Exponenten angeben, machen wir den Exponenten positiv, drehen aber die Basis um (1/$x), was mathematisch korrekt ist.
Der letzte Fall tritt ein, wenn der Exponent nicht 0 und nicht negativ ist. Dann rufen wir die Funktion bei jedem Aufruf mit um 1 verringertem Exponenten auf und multiplizieren jeweils mit $x.
Schauen wir uns jede Iteration (Wiederholung) der Funktion an:
1. Exponent -4, Zahl 2.
Hier wird die zweite if-Anweisung ausgeführt, unsere Zahl wird zum Bruch, und der Exponent positiv.
2. Exponent 4, Zahl 0,5.
Exponent ist positiv und ungleich 0, also wird die Zeile
return $x * myDegree($x, $n-1)
ausgeführt.
3. Exponent 3, Zahl 0,25.
4. Exponent 2, Zahl 0,125.
5. Exponent 1, Zahl 0,0625.
Hier trifft die erste if-Anweisung zu, also wird 1 zurückgegeben, diese 1 wird dann mit den vorherigen Ergebnissen multipliziert und die Rekursion endet.
Ein weiteres ähnliches Beispiel ist die Fakultät einer Zahl. Die Fakultät einer Zahl n ist das Produkt aller Zahlen von 1 bis n. Für 6 ist das 6*5*4*3*2*1 = 720. Und wie Sie sich sicher denken können, verwenden wir Rekursion:
<?php function myRecursion($x){ if($x == 1){ return $x; } return $x*myRecursion($x-1); } $y = myRecursion(8); print $y; ?>
Dieses Beispiel ist sogar noch einfacher als das erste, daher überlasse ich es Ihnen, die Änderungen der Parameter in der Funktion myRecursion selbst nachzuvollziehen.