PHP - Rekursivfunktionen

Hallo da draußen, angehende Programmierer! Heute tauchen wir ein in die faszinierende Welt der rekursiven Funktionen in PHP. Machen Sie sich keine Sorgen, wenn Sie neu im Programmieren sind; ich werde Sie Schritt für Schritt durch dieses Konzept führen, genau wie ich es über die Jahre mit unzähligen Schülern gemacht habe. Also holen Sie sich einen Kaffee (oder Ihr Lieblingsgetränk) und lassen Sie uns gemeinsam diese aufregende Reise antreten!

PHP - Recursive Functions

Was sind rekursive Funktionen?

Bevor wir ins Detail gehen, lassen Sie uns verstehen, was rekursive Funktionen sind. Stellen Sie sich vor, Sie schauen sich selbst im Spiegel an, und hinter Ihnen ist ein weiterer Spiegel. Sie werden eine unendliche Reflexion von sich selbst sehen, oder? Das ist in gewisser Weise ähnlich, wie rekursive Funktionen im Programmieren funktionieren!

Eine rekursive Funktion ist eine Funktion, die sich selbst während ihrer Ausführung aufruft. Es ist wie eine digitale Version der russischen Matrjoschka-Puppen, bei der jede Puppe eine kleinere Version von sich selbst innen enthält.

Warum rekursive Funktionen verwenden?

Sie fragen sich vielleicht, "Warum möchte ich, dass eine Funktion sich selbst aufruft? Ist das nicht verwirrend?"Nun, rekursive Funktionen können äußerst nützlich sein, um Probleme zu lösen, die eine wiederkehrende Struktur haben. Sie können unseren Code eleganter und für bestimmte Problemarten einfacher zu verstehen machen.

Lassen Sie uns ein einfaches Beispiel anschauen, um einen Einstieg zu finden:

function countDown($n) {
if ($n <= 0) {
echo "Blastoff!";
} else {
echo $n . "... ";
countDown($n - 1);
}
}

countDown(5);

Wenn wir diese Funktion mit countDown(5) aufrufen, passiert folgendes:

  1. Es wird "5... " ausgegeben.
  2. Dann ruft sie sich selbst mit 4 auf.
  3. Gibt "4... " aus.
  4. Ruft sich selbst mit 3 auf.
  5. Und so weiter, bis 0 erreicht wird und "Blastoff!" ausgegeben wird.

Die Ausgabe wäre: "5... 4... 3... 2... 1... Blastoff!"

Die Anatomie einer rekursiven Funktion

Jede rekursive Funktion hat zwei Hauptteile:

  1. Basisfall: Dies ist die Bedingung, die die Rekursion stoppt. Ohne ihn würde Ihre Funktion sich ewig selbst aufrufen (oder bis Ihr Computer den Speicher aufgebraucht hat)!

  2. Rekursionsfall: Dies ist der Ort, an dem die Funktion sich selbst aufruft, normalerweise mit einem veränderten Parameter.

In unserem Countdown-Beispiel ist if ($n <= 0) der Basisfall, und countDown($n - 1) ist der Rekursionsfall.

Berechnung der Fakultät durch Rekursion

Nun, da wir die Grundlagen kennen, lassen Sie uns ein klassisches Problem angehen: die Berechnung von Fakultäten. Die Fakultät einer Zahl n (geschrieben als n!) ist das Produkt aller positiven ganzen Zahlen kleiner oder gleich n.

Zum Beispiel: 5! = 5 4 3 2 1 = 120

So können wir Fakultäten mit Rekursion berechnen:

function factorial($n) {
if ($n <= 1) {
return 1;
} else {
return $n * factorial($n - 1);
}
}

echo factorial(5); // Ausgabe: 120

Lassen Sie uns das durcharbeiten:

  1. Unser Basisfall ist if ($n <= 1). Wir wissen, dass 1! und 0! beide 1 sind, also geben wir in diesem Fall 1 zurück.
  2. Für jede andere Zahl multiplizieren wir $n mit der Fakultät von (n-1).

Wenn wir factorial(5) aufrufen, passiert folgendes im Hintergrund:

factorial(5) = 5 * factorial(4)
= 5 * (4 * factorial(3))
= 5 * (4 * (3 * factorial(2)))
= 5 * (4 * (3 * (2 * factorial(1))))
= 5 * (4 * (3 * (2 * 1)))
= 5 * (4 * (3 * 2))
= 5 * (4 * 6)
= 5 * 24
= 120

Isn't es beautiful, wie die Funktion sich selbst aufruft, bis sie den Basisfall erreicht, und dann die Ergebnisse nach oben kurbeln?

Binärsuche durch Rekursion

Nun, lassen Sie uns ein komplexeres Beispiel anschauen: die binäre Suche. Die binäre Suche ist ein effizienter Algorithmus zum Auffinden eines Elements in einer sortierten Liste von Elementen. Sie funktioniert, indem sie wiederholt die Hälfte der Liste, die das Element enthalten könnte, teilt, bis nur noch ein möglicher Ort übrig bleibt.

So können wir die binäre Suche mit Rekursion implementieren:

function binarySearch($arr, $left, $right, $x) {
if ($right >= $left) {
$mid = $left + floor(($right - $left) / 2);

// Wenn das Element genau in der Mitte ist
if ($arr[$mid] == $x) {
return $mid;
}

// Wenn das Element kleiner als die Mitte ist, kann es nur im linken Teil sein
if ($arr[$mid] > $x) {
return binarySearch($arr, $left, $mid - 1, $x);
}

// Andernfalls kann das Element nur im rechten Teil sein
return binarySearch($arr, $mid + 1, $right, $x);
}

// Wenn wir hier ankommen, ist das Element nicht im Array
return -1;
}

$arr = [2, 3, 4, 10, 40];
$x = 10;
$result = binarySearch($arr, 0, count($arr) - 1, $x);
echo ($result == -1) ? "Element ist nicht im Array vorhanden" : "Element ist an Index " . $result . " vorhanden";

Diese Funktion mag initially einschüchternd aussehen, aber lassen Sie uns sie durcharbeiten:

  1. Wir beginnen damit, zu prüfen, ob der rechte Index größer oder gleich dem linken Index ist. Dies ist unsere Fortsetzungsbedingung.
  2. Wir berechnen den mittleren Index.
  3. Wenn das mittlere Element unser Ziel ist, sind wir fertig!
  4. Wenn das mittlere Element größer als unser Ziel ist, durchsuchen wir rekursiv die linke Hälfte des Arrays.
  5. Wenn das mittlere Element kleiner als unser Ziel ist, durchsuchen wir rekursiv die rechte Hälfte des Arrays.
  6. Wenn wir unsere Suche erschöpft haben (rechts < links), geben wir -1 zurück, um anzuzeigen, dass das Element nicht gefunden wurde.

Die Schönheit dieses rekursiven Ansatzes besteht darin, wie er das Problem natürlich in kleinere Unteraufgaben aufteilt, was den Code elegant und leicht verständlich macht, wenn man das Konzept einmal verstanden hat.

Schlussfolgerung

Rekursive Funktionen mögen initially ein bisschen verwirrend erscheinen, aber sie sind ein äußerst mächtiges Werkzeug im Arsenal eines Programmierers. Sie ermöglichen es uns, komplexe Probleme mit elegantem, kurzen Code zu lösen. Wenn Sie mehr üben, werden Sie beginnen, Probleme zu erkennen, die sich gut für rekursive Lösungen eignen.

Denken Sie daran, dass wie jedes mächtige Werkzeug auch die Rekursion mit Bedacht eingesetzt werden sollte. Manchmal kann eine iterative Lösung effizienter oder einfacher zu verstehen sein. Mit zunehmender Erfahrung werden Sie eine Intuition dafür entwickeln, wann man Rekursion und wann andere Ansätze verwenden sollte.

Weiter codieren, weiter experimentieren und vor allem: haben Sie Spaß! Programmieren ist ebenso eine Kunst wie eine Wissenschaft, und das Beherrschen von Konzepten wie Rekursion wird Ihnen helfen, beautiful, effizienten Code zu erstellen. Bis zum nächsten Mal, fröhliches Coden!

Credits: Image by storyset