Was für Laien eine rekursive Funktion mit PHP ist

Lesezeit: 7 Minuten

Was fur Laien eine rekursive Funktion mit PHP ist
Imran

Kann mir bitte jemand eine rekursive Funktion in PHP (ohne Fibonacci) in Laiensprache und anhand von Beispielen erklären? Ich habe mir ein Beispiel angesehen, aber der Fibonacci hat mich total verloren!

Vielen Dank im Voraus 😉 Und wie oft verwenden Sie sie in der Webentwicklung?

  • Lesen Sie sich stackoverflow.com/questions/2648968 durch und es wird irgendwann Sinn machen.

    – Kevin

    15. April 2010 um 21:07 Uhr

  • Oder versuchen Sie es Meinten Sie den Link bei Google: google.com/search?hl=de&q=rekursion

    – Gordon

    15. April 2010 um 21:10 Uhr


  • @kevin vielleicht solltest du den Kommentar als “duplicate stackoverflow.com/questions/2648968” schreiben;)

    – Programmmann

    15. April 2010 um 21:23 Uhr


  • @Kevin: Aber du hast den Basisfall vergessen! Rekursion lernt er auf diese Weise nicht, er klickt einfach so lange darauf, bis sein Stack überläuft. 🙁

    – CA McCann

    15. April 2010 um 21:23 Uhr

  • @camccann angemessen, denke ich, angesichts der Seite, auf der wir uns befinden

    – Bernstein

    15. April 2010 um 21:24 Uhr

1646902449 601 Was fur Laien eine rekursive Funktion mit PHP ist
Anthony Forloney

Laienbegriffe:

Eine rekursive Funktion ist eine Funktion, die aufruft selbst

Etwas mehr in die Tiefe:

Wenn die Funktion sich ständig selbst aufruft, woher weiß sie, wann sie aufhören soll? Sie richten eine Bedingung ein, die als Basisfall bezeichnet wird. Basisfälle teilen unserem rekursiven Aufruf mit, wann er aufhören soll, andernfalls wird er endlos wiederholt.

Was für mich ein gutes Lernbeispiel war, da ich einen starken mathematischen Hintergrund habe Fakultät. Durch die Kommentare unten scheint die Fakultätsfunktion etwas zu viel zu sein, ich lasse es hier, nur für den Fall, dass Sie es wollten.

function fact($n) {
  if ($n === 0) { // our base case
     return 1;
  }
  else {
     return $n * fact($n-1); // <--calling itself.
  }
}

In Bezug auf die Verwendung rekursiver Funktionen in der Webentwicklung greife ich persönlich nicht auf rekursive Aufrufe zurück. Nicht, dass ich es für schlecht halten würde, sich auf Rekursion zu verlassen, aber sie sollten nicht Ihre erste Option sein. Sie können tödlich sein, wenn sie nicht richtig eingesetzt werden.

Obwohl ich mit dem Verzeichnisbeispiel nicht mithalten kann, hoffe ich, dass dies etwas hilft.

(20.04.10) Aktualisierung:

Es wäre auch hilfreich, diese Frage zu überprüfen, wo die akzeptierte Antwort in Laiensprache demonstriert, wie eine rekursive Funktion funktioniert. Obwohl sich die Frage des OP mit Java befasste, ist das Konzept dasselbe.

  • Grundlegende Rekursion verstehen

  • Obwohl Ihr Beispiel es gut erklärt, kann das Beispiel für Laien kaum als Beispiel angesehen werden. Wenn OP ein bisschen Probleme hat, die Rekursion basierend auf einem Fibonacci-Beispiel zu verstehen, stelle ich mir vor, dass Fakultäten es auch nicht schneiden werden. Besonders mit diesen mathematischen Definitionen.

    – Anständiger Dabbler

    15. April 2010 um 21:39 Uhr

  • @fireeyedboy, stereofrog: Im College wurde mir beim Erlernen der Rekursion die Fakultätsfunktion beigebracht, und es hat bei mir Klick gemacht. Das OP und ich haben wahrscheinlich unterschiedliche mathematische Hintergründe, aber trotzdem habe ich die faktorielle Definition der Kürze halber weggelassen und meine Laiendefinition der Rekursion betont.

    – Anthony Forloney

    15. April 2010 um 22:29 Uhr

  • Es ist nicht erforderlich, eine Endbedingung (Basisfall) für eine Funktion zu haben, die Ihre Definition etwas falsch macht. (Obwohl Sie in PHP sonst mit einem Stapelüberlauf enden müssen)

    – Yacoby

    15. April 2010 um 22:32 Uhr


1646902449 529 Was fur Laien eine rekursive Funktion mit PHP ist
Programmierer

Ein Beispiel wäre, jede Datei in einem beliebigen Unterverzeichnis eines bestimmten Verzeichnisses zu drucken (wenn Sie keine Symlinks in diesen Verzeichnissen haben, die die Funktion irgendwie unterbrechen könnten). Ein Pseudo-Code zum Drucken aller Dateien sieht folgendermaßen aus:

function printAllFiles($dir) {
    foreach (getAllDirectories($dir) as $f) {
        printAllFiles($f); // here is the recursive call
    }
    foreach (getAllFiles($dir) as $f) {
        echo $f;
    }
}

Die Idee ist, zuerst alle Unterverzeichnisse auszudrucken und dann die Dateien des aktuellen Verzeichnisses. Diese Idee wird auf alle Unterverzeichnisse angewendet, und das ist der Grund für den rekursiven Aufruf dieser Funktion für alle Unterverzeichnisse.

Wenn Sie dieses Beispiel ausprobieren möchten, müssen Sie nach den speziellen Verzeichnissen suchen . und ..sonst bleiben Sie beim Anrufen hängen printAllFiles(".") die ganze Zeit. Zusätzlich müssen Sie prüfen, was gedruckt werden soll und welches Ihr aktuelles Arbeitsverzeichnis ist (siehe opendir(), getcwd()…).

  • Ich mag diese Antwort besser als die faktorielle, weil sie tatsächlich zutrifft. Wie viele Leute müssen tatsächlich jemals Fakultäten berechnen, und warum würden Sie Fakultäten sowieso rekursiv machen (Memoisierung vielleicht, aber an diesem Punkt, warum nicht einfach von Anfang an eine Nachschlagetabelle verwenden).

    – davidtbernal

    15. April 2010 um 21:50 Uhr

1646902450 908 Was fur Laien eine rekursive Funktion mit PHP ist
Freyr

Rekursion ist etwas, das sich wiederholt. Wie eine Funktion, die sich selbst aus sich heraus aufruft. Lassen Sie es mich an einem etwas Pseudobeispiel demonstrieren:

Stell dir vor, du bist mit deinen Kumpels unterwegs und trinkst Bier, aber deine Frau wird dir die Hölle heiß machen, wenn du nicht vor Mitternacht nach Hause kommst. Lassen Sie uns zu diesem Zweck die Funktion orderAndDrinkBeer($time) erstellen, wobei $time gleich Mitternacht minus der Zeit ist, die Sie benötigen, um Ihr aktuelles Getränk auszutrinken und nach Hause zu kommen.

An der Bar angekommen, bestellen Sie also Ihr erstes Bier und beginnen mit dem Trinken:

$timeToGoHome="23";  // Let's give ourselves an hour for last call and getting home

function orderAndDrinkBeer($timeToGoHome) {  // Let's create the function that's going to call itself.
    $beer = New Beer();  // Let's grab ourselves a new beer
    $currentTime = date('G'); // Current hour in 24-hour format

    while ($beer->status != 'empty') {  // Time to commence the drinking loop
        $beer->drink();  // Take a sip or two of the beer(or chug if that's your preference)
    }

    // Now we're out of the drinking loop and ready for a new beer

    if ($currentTime < $timeToGoHome) { // BUT only if we got the time
        orderAndDrinkBeer($timeToGoHome);  // So we make the function call itself again!
    } else {  // Aw, snap!  It is time :S
        break; // Let's go home :(
    }
}

Hoffen wir nur, dass du nicht genug Bier getrunken hast, um so betrunken zu werden, dass deine Frau dich auf der Couch schlafen lässt, obwohl du pünktlich zu Hause bist -.-

Aber ja, das ist ziemlich genau, wie Rekursion geht.

  • 10 Jahre später hat mir diese Antwort den Tag versüßt!

    – Professorval

    7. Dezember 2020 um 10:27 Uhr

Was fur Laien eine rekursive Funktion mit PHP ist
James Westtor

Es ist eine Funktion, die sich selbst aufruft. Es ist nützlich, um bestimmte Datenstrukturen zu durchlaufen, die sich wiederholen, z. B. Bäume. Ein HTML-DOM ist ein klassisches Beispiel.

Ein Beispiel für eine Baumstruktur in Javascript und eine rekursive Funktion zum “Durchlaufen” des Baums.

    1
   / \
  2   3
     / \
    4   5

var tree = {
  id: 1,
  left: {
    id: 2,
    left: null,
    right: null
  },
  right: {
    id: 3,
    left: {
      id: 4,
      left: null,
      right: null
    },
    right: {
      id: 5,
      left: null,
      right: null
    }
  }
};

Um den Baum zu durchlaufen, rufen wir dieselbe Funktion wiederholt auf und übergeben die untergeordneten Knoten des aktuellen Knotens an dieselbe Funktion. Dann rufen wir die Funktion erneut auf, zuerst auf dem linken Knoten und dann auf dem rechten.

In diesem Beispiel erhalten wir die maximale Tiefe des Baums

var depth = 0;

function walkTree(node, i) {

  //Increment our depth counter and check
  i++;
  if (i > depth) depth = i;

  //call this function again for each of the branch nodes (recursion!)
  if (node.left != null) walkTree(node.left, i);
  if (node.right != null) walkTree(node.right, i);

  //Decrement our depth counter before going back up the call stack
  i--;
}

Schließlich rufen wir die Funktion auf

alert('Tree depth:' + walkTree(tree, 0));

Eine gute Möglichkeit, die Rekursion zu verstehen, besteht darin, den Code zur Laufzeit schrittweise durchzugehen.

Was fur Laien eine rekursive Funktion mit PHP ist
Samuel

Einfach ausgedrückt: Eine rekursive Funktion ist eine Funktion, die sich selbst aufruft.

1646902451 335 Was fur Laien eine rekursive Funktion mit PHP ist
Imran Naqvi

Es ist sehr einfach, wenn eine Funktion sich selbst aufruft, um eine Aufgabe für unbestimmte und endliche Zeit zu erledigen. Ein Beispiel aus meinem eigenen Code, Funktion zum Auffüllen eines Kategoriebaums mit mehreren Ebenen

function category_tree($parent=0,$sep='')
{
    $q="select id,name from categorye where parent_id=".$parent;
    $rs=mysql_query($q);
    while($rd=mysql_fetch_object($rs))
    {
        echo('id.'">'.$sep.$rd->name.'');
        category_tree($rd->id,$sep.'--');
    }
}

1646902451 17 Was fur Laien eine rekursive Funktion mit PHP ist
Shane-Schloss

Rekursion ist eine schicke Art zu sagen: “Mach das Ding noch einmal, bis es fertig ist”.

Zwei wichtige Dinge zu haben:

  1. Ein Basisfall – Sie haben ein Ziel zu erreichen.
  2. Ein Test – Wie Sie wissen, ob Sie dort angekommen sind, wo Sie hinwollen.

Stellen Sie sich eine einfache Aufgabe vor: Sortieren Sie einen Stapel Bücher alphabetisch. Ein einfacher Prozess wäre, die ersten beiden Bücher zu nehmen und sie zu sortieren. Jetzt kommt der rekursive Teil: Gibt es mehr Bücher? Wenn ja, wiederholen Sie es. Das “do it again” ist die Rekursion. Das “Gibt es noch Bücher” ist der Test. Und “nein, keine Bücher mehr” ist der Basisfall.

987200cookie-checkWas für Laien eine rekursive Funktion mit PHP ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy