Was in juristischer Hinsicht ist eine Rekursive Funktion mit PHP
Kann bitte jemand erklären, wie eine rekursive Funktion die mir in PHP (ohne die Verwendung von Fibonacci) in allgemeinverständlicher Sprache und anhand von Beispielen? ich war auf der Suche an einem Beispiel-aber die Fibonacci-völlig verloren zu mir!
Danke im Voraus 😉
Auch, wie oft verwenden Sie Sie in web-Entwicklung?
- Lesen durch die stackoverflow.com/questions/2648968 und es wird Sinn machen, schließlich.
- Oder probieren Hast Du meinen link bei Google: google.com/search?hl=en&q=Rekursion
- LOL! Das ist erstaunlich, es hat mich 3 Klicks, um tatsächlich zu stoppen. Ich dachte, es war Dinkel falsch, d ' Oh.
- vielleicht sollte man schrieb den Kommentar als "doppelte stackoverflow.com/questions/2648968 " 😉
- Aber Sie haben vergessen die Basis-Fall! Er wird nicht lernen Rekursion, die Art und Weise, er werde nur halten Sie, auf ihn bis zu seinem stack überläuft. 🙁
- angemessen, würde ich denken, da der Website-wir sind auf
- Ich denke, das Beispiel kurz und bündig ist, wenn der link in einem neuen Fenster geöffnet, wie dies würde zeigen, daß der Effekt des abnehmenden Ressourcen.
- guter Punkt. Was sollten wir eigentlich tun, ist die Verknüpfung zu der vorherigen Instanz des Witzes.
- Ich will gar nicht sagen, wie oft ich geklickt, dass 🙁
- Erstellen Treeview Mit Rekursion in PHP - browse-tutorials.com/tutorial/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laymens Begriffe:
Eine rekursive Funktion ist eine Funktion, die nennt sich
Ein bisschen mehr in die Tiefe:
Wenn die Funktion Aufruf hält sich, wie funktioniert es wissen, Wann zu beenden? Sie richten einen Zustand, bekannt als eine Basis-Fall. Basis Fälle sagen, unser rekursiver Aufruf, Wann man aufhören, sonst wird es eine Endlosschleife.
Was war eine gute Lern-Beispiel für mich, denn ich habe einen starken hintergrund in der Mathematik, war Fakultät. Durch die Kommentare unten, es scheint, die fakultaet-Funktion ist vielleicht ein bisschen zu viel, ich lasse es hier nur für den Fall, dass Sie es wollte.
In Bezug auf die Verwendung von rekursiven Funktionen in der web-Entwicklung, die ich nicht persönlich Rückgriff auf mit rekursiven Aufrufe. Nicht, dass ich hielte es für schlecht, die Praxis zu verlassen, Rekursion, aber Sie sollte nicht Ihre erste option. Sie kann tödlich sein, wenn nicht ordnungsgemäß verwendet.
Obwohl ich kann nicht konkurrieren mit dem Verzeichnis-Beispiel, ich hoffe, das hilft etwas.
(4/20/10) Update:
Hilfreich wäre es auch, zu prüfen, diese Frage, wo die akzeptierte Antwort, die zeigt, in Bezug auf Laien, wie eine rekursive Funktion funktioniert. Auch wenn die OP ' s Frage befasste sich mit Java, das Konzept ist das gleiche,
Ein Beispiel wäre, drucken Sie jede Datei in alle Unterverzeichnisse des angegebenen Verzeichnis (wenn Sie keine symlinks in den Verzeichnissen, die brechen kann die Funktion irgendwie). Ein pseudo-code, der die Ausgabe aller Dateien sieht wie folgt aus:
Die Idee ist, drucken Sie alle sub-Verzeichnisse und dann die Dateien des aktuellen Verzeichnisses. Diese Idee bekommen, gelten für alle Unterverzeichnisse, und das ist der Grund für den Aufruf dieser Funktion wird rekursiv für alle Unterverzeichnisse.
Wenn Sie möchten, um zu versuchen, dieses Beispiel haben Sie zu prüfen, für die Besondere Verzeichnisse
.
und..
, sonst werden Sie nicht weiterkommen in BerufungprintAllFiles(".")
alle Zeit. Zusätzlich müssen Sie prüfen, was Sie drucken und was ist Ihr Aktuelles Arbeitsverzeichnis (sieheopendir()
,getcwd()
, ...).Rekursion ist etwas, das sich wiederholt. Wie eine Funktion, die nennt sich selbst in sich selbst. Lassen Sie mich demonstrieren, in einer etwas pseudo Beispiel:
Stell dir vor, du bist mit deinen Kumpels Bier zu trinken, aber Ihre Frau wird Ihnen die Hölle, wenn du nicht nach Hause kommen vor Mitternacht. Zu diesem Zweck erstellen wir die orderAndDrinkBeer($time) - Funktion, wobei $Zeit ist Mitternacht, minus die Zeit, die Sie benötigen, um Ihre aktuelle trinken und nach Hause kommen.
So, angekommen an der bar, bestellen Sie Ihr erstes Bier und beginnen das trinken:
Nun hoffen wir einfach, dass Sie nicht in der Lage waren zu trinken Sie genug Bier, um sich so berauscht, dass Sie Ihre Frau ist, wird Sie auf der couch schlafen, unabhängig davon ob es Zuhause auf Zeit -.-
Aber ja, das ist ziemlich viel, wie die Rekursion geht.
Seine eine Funktion, die sich selbst aufruft. Seine nützlich für das gehen bestimmte Daten-Strukturen, die sich wiederholen, wie z.B. Bäume. Ein HTML-DOM ist ein klassisches Beispiel.
Ein Beispiel für eine Baumstruktur in javascript und einer rekursiven Funktion 'gehe' der Baum.
--
Gehen den Baum, nennen wir die gleiche Funktion wiederholt, vorbei an den Kind-Knoten des aktuellen Knotens, um die gleiche Funktion. Dann rufen wir die Funktion wieder auf, zunächst auf der linken Seite den Knoten, und klicken Sie dann auf der rechten Seite.
In diesem Beispiel, erhalten wir die maximale Tiefe des Baumes
Schließlich rufen wir die Funktion
Eine tolle Art zu verstehen, ist die Rekursion zu Schritt durch den code zur Laufzeit.
Einfach ausgedrückt: eine rekursive Funktion ist Eine Funktion, die sich selbst aufruft.
Es ist sehr einfach, wenn eine Funktion ruft sich selbst für die Erfüllung einer Aufgabe für nicht definierte und begrenzte Anzahl von Zeit. Ein Beispiel aus meinem eigenen code-Funktion für das Auffüllen einer mit Multi-Level-Kategorie-Baum
Rekursion ist eine ausgefallene Art zu sagen, "Mach das Ding wieder, bis es fertig ist".
Zwei wichtige Dinge haben:
Stellen Sie sich eine einfache Aufgabe: Sortiere einen Stapel Bücher in alphabetischer Reihenfolge. Ein einfaches Verfahren wäre, die beiden ersten Bücher, Sie zu Sortieren. Nun, hier kommt der rekursive Teil: gibt es noch mehr Bücher? Wenn ja, tun Sie es wieder. Die "do it again" ist die Rekursion. Die "sind noch mehr Bücher" ist der test. Und "Nein, keine Bücher mehr" ist der base case.
Beste Erklärung, die ich gefunden habe, als ich lernte, dass ich mich hier:http://www.elated.com/articles/php-recursive-functions/
Ist da eine Sache:
Die Funktion, wenn die genannt werden im Speicher erstellt wurde (neue Instanz erstellt wird)
Also die rekursive Funktion IST NICHT CALLLING SICH, aber Ihre Berufung andere Instanz - so seine nicht von einer Funktion im Speicher einige Magische. Seine paar Instanzen im Speicher, die zurückkehren und sich einige Werte - und dieses Verhalten ist das gleiche, wenn zum Beispiel Funktion a ruft Funktion b. Sie haben zwei Instanzen und auch, wenn rekursive Funktion, die aufgerufen wird eine neue Instanz von sich selbst.
Versuchen Sie, zeichnen Sie den Speicher mit den Instanzen auf dem Papier, es wird Sinn machen.
Rekursion ist eine alternative zu Schleifen, es ist ganz selten, dass Sie bringen mehr Klarheit oder Eleganz zu Ihrem code. Ein gutes Beispiel war gegeben, die von Progman Antwort, wenn würde er Sie nicht verwenden die Rekursion er würde gezwungen sein, zu verfolgen, in welchem Verzeichnis er ist derzeit (das heißt Staatliche) rekursionen erlaubt ihm zu tun, die Buchhaltung mit dem stack (den Bereich, wo Variablen und return-Adresse einer Methode gespeichert werden)
Die standard-Beispiele, die Fakultät und Fibonacci sind nicht nützlich für das Verständnis des Konzepts, denn Sie sind leicht zu ersetzen durch eine Schleife.
Grundsätzlich ist dieser. Es hält sich selbst aufrufenden, bis es fertig ist
Funktioniert auch mit Schleifen!
Können Sie auch versuchen Sie googeln es. Hinweis: die "meinten Sie" (Klick drauf...). http://www.google.com/search?q=recursion&spell=1
Hier ist ein praktisches Beispiel (es gibt mehrere gute schon). Ich wollte nur hinzufügen, das nützlich ist, zu fast jeder Entwickler.
Irgendwann, müssen Entwickler parse ein Objekt, das so eine Antwort von einer API oder irgendeine Art von Objekt oder ein array.
Diese Funktion wird zuerst aufgerufen, um zu analysieren, ein Objekt, das können nur die Parameter enthalten, aber was ist, wenn das Objekt auch andere Objekte enthält oder arrays? Diese müssen angegangen werden, und für den größten Teil der basic-Funktion tut dies bereits, so dass die Funktion ruft sich selbst erneut (nach der Bestätigung, dass der Schlüssel oder der Wert ist entweder ein Objekt oder ein array) und analysiert dieses neue Objekt oder ein array. Letztlich, was zurückgegeben wird ein string, der schafft jeden parameter in eine eigene Zeile für die Lesbarkeit, aber Sie könnten genauso einfach protokollieren Sie die Werte in einer log-Datei oder einen insert in eine DB oder was auch immer.
Habe ich den
$prefix
parameter zu verwenden das parent-element zu beschreiben, das Ende variabel, so dass wir sehen können, was den Wert betrifft. Es hat nicht gehören Dinge wie null-Werte, aber dies kann geändert werden, aus diesem Beispiel.Wenn Sie das Objekt:
und Verwendung:
zurück:
und hier ist der code zu analysieren, es in einen string mit einem Zeilenumbruch für jeden parameter:
Dadurch wird das Objekt zurückgegeben, das Sie wie folgt vor:
Habe ich die geschachtelte switch Aussagen zur Vermeidung von Verwechslungen mit
if . . . ifelse . . . else
, aber es war fast genauso lang. Wenn es hilft, Fragen Sie einfach nach der if-Bedingungen, und ich kann fügen Sie für diejenigen, die es brauchen.Fuß durch einen Verzeichnis-Baum ist ein gutes Beispiel. Sie können tun, etwas ähnliches zu verarbeiten ein array. Hier ist eine wirklich einfache rekursive Funktion, die einfach Prozesse einer Schnur, ein einfaches array von strings oder ein verschachteltes array von strings beliebiger Tiefe, ersetzen von Instanzen von "Hallo" mit 'auf Wiedersehen' in der Zeichenkette oder die Werte des Arrays bzw. jedes sub-array:
Er weiß, Wann zu beenden, da irgendwann das "Ding" in der Verarbeitung ist und nicht ein array. Zum Beispiel, wenn Sie anrufen replaceHello('Hallo'), wird es wieder 'auf Wiedersehen'. Wenn Sie senden Sie es ein array von strings ist, obwohl es selbst aufrufen, einmal für jedes Element des Arrays, das array verarbeitet.
Wenn Sie einen bestimmten Wert (sagen wir, "1") zu Anthony Forloney Beispiel, wäre alles klar:
original:
Dies ist ein sehr einfaches Beispiel der Fakultät mit Rekursion:
Factorials sind eine sehr einfache Mathe-Konzept. Sie sind geschrieben wie 5! und das bedeutet 5 * 4 * 3 * 2 * 1. Also 6! 720 und 4! 24.
hoffe, dies ist nützlich für Sie. 🙂
Es funktioniert ein einfaches Beispiel recursive (Y)
Rekursion verwendet für die Kaprekar-Konstante
}
Die Funktion der Aufruf hält sich mit dem Ergebnis der Berechnung, bis es erreicht Kaprekars Konstante, an die er zurückkehren wird, die Höhe der Zeit, die die Berechnungen gemacht wurde.
/edit Für alle, die nicht wissen, Kaprekars Konstant, es sollte die Eingabe von 4 Ziffern mit mindestens zwei unterschiedlichen stellen.
Ich nicht finden, die Beispiele hilfreich entweder. Sie nicht, lösen zwei Probleme auf einmal, wenn es die Mathematik beteiligt, Ihre Meinung ist der Wechsel zwischen zwei Problemen. Genug geredet
Beispiel:
Habe ich eine Funktion, wo ich bin explodierenden strings in ein array auf Basis
:
Trennzeichen.Habe ich noch eine Funktion, wo ich die strings als Eingabe
Das problem ist, mein input hat eine verschachtelte array-und meine
explodeString
Funktion erhalten, die eine Artstring
. Ich kann neu schreiben einige code inexplodeString
Funktion einstellen, aber ich brauche noch die gleiche Funktion zu tun die gleiche operation an meinem string. Das ist, wo kann ich die Methode aufrufenrecursively
innerhalb. So hier ist der LetzteexplodeString
Funktion mit Rekursion.