Die Idee der Rekursion ist in der realen Welt nicht sehr verbreitet. Für Anfänger ist es also etwas verwirrend. Aber ich denke, sie gewöhnen sich allmählich an das Konzept. Also, was kann eine nette Erklärung für sie sein, um die Idee leicht zu verstehen?
74
Antworten:
Um die Rekursion zu erklären , verwende ich eine Kombination verschiedener Erklärungen, normalerweise um beide zu versuchen:
Für den Anfang definiert Wolfram | Alpha es in einfacheren Begriffen als Wikipedia :
Mathe
Wenn Ihr Schüler (oder die Person, die Sie erklären, von nun an Student) zumindest einen mathematischen Hintergrund hat, sind sie offensichtlich bereits auf eine Rekursion gestoßen, indem sie Serien studierten, und auf ihre Vorstellung von Rekursivität und ihre Wiederholungsrelation .
Ein sehr guter Anfang ist es dann, mit einer Serie zu demonstrieren und zu sagen, dass es ganz einfach darum geht, worum es bei der Rekursion geht:
Normalerweise bekommt man entweder bestenfalls ein "huh huh whatev", weil sie es immer noch nicht benutzen, oder eher nur ein sehr tiefes Schnarchen.
Codierungsbeispiele
Im übrigen ist es tatsächlich eine detaillierte Version von dem, was ich im vorliegenden Addendum von meiner Antwort für die Frage , die Sie in Bezug auf Hinweise darauf (schlechtes Wortspiel).
Zu diesem Zeitpunkt wissen meine Schüler normalerweise, wie man etwas auf dem Bildschirm druckt. Angenommen, wir verwenden C, wissen sie, wie man ein einzelnes Zeichen mit
write
oder drucktprintf
. Sie kennen sich auch mit Regelkreisen aus.Normalerweise greife ich auf ein paar sich wiederholende und einfache Programmierprobleme zurück, bis sie es bekommen:
Fakultät
Factorial ist ein sehr einfach zu verstehendes mathematisches Konzept, und die Implementierung kommt seiner mathematischen Darstellung sehr nahe. Sie könnten es jedoch zunächst nicht bekommen.
Alphabete
Die alphabetische Version ist interessant, um sie zu lehren, über die Reihenfolge ihrer rekursiven Anweisungen nachzudenken. Wie bei Zeigern werden Sie nur zufällig mit Linien beworfen. Der Punkt ist, sie zu der Erkenntnis zu bringen, dass eine Schleife invertiert werden kann, indem entweder die Bedingungen modifiziert werden ODER indem einfach die Reihenfolge der Anweisungen in Ihrer Funktion invertiert wird. Hier hilft das Drucken des Alphabets, da es für sie etwas Visuelles ist. Lassen Sie sie einfach eine Funktion schreiben, die für jeden Aufruf ein Zeichen druckt und sich selbst rekursiv aufruft, um das nächste (oder vorherige) Zeichen zu schreiben.
FP-Fans, überspringen Sie die Tatsache, dass das Drucken von Inhalten in den Ausgabestream vorerst ein Nebeneffekt ist. (Wenn Sie jedoch eine Sprache mit Listenunterstützung verwenden, können Sie sie bei jeder Iteration zu einer Liste verketten und nur das Endergebnis ausdrucken. Normalerweise beginne ich sie jedoch mit C, was für diese Art von Problemen und Konzepten leider nicht das Beste ist.) .
Potenzierung
Das Exponentiationsproblem ist etwas schwieriger ( in dieser Lernphase). Offensichtlich ist das Konzept genau das gleiche wie für eine Fakultät und es gibt keine zusätzliche Komplexität ... außer dass Sie mehrere Parameter haben. Und das ist normalerweise genug, um die Leute zu verwirren und sie am Anfang wegzuwerfen.
Seine einfache Form:
kann wie folgt ausgedrückt werden:
Schwerer
Sobald diese einfachen Probleme gezeigt UND in Tutorials erneut implementiert wurden, können Sie etwas schwierigere (aber sehr klassische) Übungen geben:
Hinweis: Wiederum sind einige davon nicht wirklich schwieriger ... Sie nähern sich dem Problem nur aus genau dem gleichen oder einem etwas anderen Winkel. Übung macht den Meister.
Helfer
Eine Referenz
Ein bisschen Lesen tut nie weh. Nun, das wird es zuerst und sie werden sich noch verlorener fühlen. So etwas wächst auf dir und sitzt in deinem Hinterkopf, bis dir eines Tages klar wird, dass du es endlich kapierst. Und dann denkst du an diese Sachen zurück, die du gelesen hast. Die Rekursion , Rekursion in der Informatik und Rekursionsbeziehungsseiten auf Wikipedia würden vorerst genügen.
Niveau / Tiefe
Unter der Annahme, dass Ihre Schüler nicht viel Erfahrung mit dem Programmieren haben, sollten Sie Code-Stubs bereitstellen. Geben Sie ihnen nach den ersten Versuchen eine Druckfunktion, mit der die Rekursionsstufe angezeigt werden kann. Das Drucken des numerischen Werts der Ebene hilft.
Das Stack-as-Drawers-Diagramm
Das Einrücken eines gedruckten Ergebnisses (oder der Ausgabe der Ebene) ist ebenfalls hilfreich, da es eine weitere visuelle Darstellung der Aktionen Ihres Programms gibt und Stapelkontexte wie Schubladen oder Ordner in einem Dateisystem-Explorer öffnet und schließt.
Rekursive Akronyme
Wenn Ihr Schüler bereits ein wenig mit Computerkultur vertraut ist, verwendet er möglicherweise bereits einige Projekte / Software mit Namen, die rekursive Akronyme verwenden . Es ist eine Tradition, die schon seit einiger Zeit besteht, insbesondere in GNU-Projekten. Einige Beispiele sind:
Rekursiv:
Gegenseitig rekursiv:
Lassen Sie sie versuchen, ihre eigenen zu finden.
Ebenso gibt es viele Fälle von rekursivem Humor, wie beispielsweise die rekursive Suchkorrektur von Google . Weitere Informationen zur Rekursion finden Sie in dieser Antwort .
Fallstricke und weiteres Lernen
Einige Probleme, mit denen Menschen normalerweise zu kämpfen haben und für die Sie Antworten wissen müssen.
Warum, oh Gott, warum ???
Warum würdest du das tun? Ein guter, aber nicht offensichtlicher Grund ist, dass es oft einfacher ist, ein Problem auf diese Weise auszudrücken. Ein nicht so guter, aber offensichtlicher Grund ist, dass es oft weniger Tipparbeit erfordert (lassen Sie sie sich nicht soooo fühlen, wenn Sie nur die Rekursion verwenden ...).
Einige Probleme sind definitiv leichter zu lösen, wenn ein rekursiver Ansatz verwendet wird. In der Regel passt jedes Problem, das Sie mit einem Divide and Conquer- Paradigma lösen können, zu einem mehrfach verzweigten Rekursionsalgorithmus.
Was ist N nochmal?
Warum ist mein
n
oder (wie auch immer der Name Ihrer Variablen lautet ) jedes Mal anders? Anfänger haben normalerweise ein Problem damit, zu verstehen, was eine Variable und ein Parameter sind und wie dien
in Ihrem Programm genannten Dinge unterschiedliche Werte haben können. Wenn sich dieser Wert also im Regelkreis oder in der Rekursion befindet, ist das noch schlimmer! Seien Sie nett und verwenden Sie nicht überall dieselben Variablennamen. Machen Sie deutlich, dass Parameter nur Variablen sind .Endebedingungen
Wie bestimme ich meinen Endzustand? Das ist ganz einfach, lassen Sie sie einfach die Schritte laut aussprechen. Zum Beispiel für die Fakultät von 5, dann 4, dann ... bis 0.
Der Teufel steckt im Detail
Sprechen Sie nicht zu früh über Dinge wie die Optimierung von Tail Calls . Ich weiß, ich weiß, TCO ist nett, aber es interessiert sie zuerst nicht. Geben Sie ihnen etwas Zeit, um den Prozess so zu gestalten, wie es für sie funktioniert. Fühlen Sie sich frei, ihre Welt später wieder zu zerstören, aber geben Sie ihnen eine Pause.
Sprechen Sie in ähnlicher Weise nicht direkt von der ersten Vorlesung an über den Aufrufstapel und seinen Speicherverbrauch und ... nun ... den Stapelüberlauf . Ich unterrichte oft Privatschüler, die mir Vorlesungen zeigen, in denen sie 50 Folien über alles haben, was man über Rekursion wissen muss, wenn sie zu diesem Zeitpunkt kaum eine Schleife richtig schreiben können. Das ist ein gutes Beispiel dafür , wie eine Referenz helfen später aber im Moment nur verwirrt Sie tief.
Machen Sie aber bitte rechtzeitig klar, dass es Gründe gibt, den iterativen oder rekursiven Weg zu gehen .
Gegenseitige Rekursion
Wir haben gesehen, dass Funktionen rekursiv sein können und sogar mehrere Aufrufpunkte haben können (8-Königinnen, Hanoi, Fibonacci oder sogar ein Erkundungsalgorithmus für einen Minensucher). Aber was ist mit gegenseitig rekursiven Aufrufen ? Beginnen Sie auch hier mit Mathe.
f(x) = g(x) + h(x)
wog(x) = f(x) + l(x)
undh
undl
nur Sachen machen.Das Beginnen mit nur mathematischen Reihen erleichtert das Schreiben und Implementieren, da der Vertrag durch die Ausdrücke klar definiert ist. Zum Beispiel die Hofstadter weiblichen und männlichen Sequenzen :
Jedoch in Bezug auf Code, es zu beachten ist , dass die Umsetzung einer für beide Seiten rekursive Lösung häufig Doppelarbeit zu codieren führt und sollte eher in eine einzige rekursive Form rationalisiert werden (siehe Peter Norvig ‚s Solving Jedes Sudoku Puzzle .
quelle
static unsigned int vote = 1;
von mir. Verzeihen Sie den statischen Humor, wenn Sie wollen :) Dies ist die bisher beste Antwort.Der Aufruf einer Funktion aus derselben Funktion heraus.
quelle
Rekursion ist eine Funktion, die sich selbst aufruft.
Es ist wichtig zu wissen, wie man es benutzt, wann man es benutzt und wie man schlechtes Design vermeidet. Dazu muss man es selbst ausprobieren und verstehen, was passiert.
Das Wichtigste, was Sie wissen müssen, ist, sehr vorsichtig zu sein, um keine Schleife zu erhalten, die niemals endet. Die Antwort von pramodc84 auf Ihre Frage hat diesen Fehler: Sie endet nie ...
Eine rekursive Funktion muss immer nach einer Bedingung suchen , um festzustellen, ob sie sich selbst erneut aufrufen soll oder nicht.
Das klassischste Beispiel für die Verwendung der Rekursion ist die Arbeit mit einem Baum ohne statische Tiefenbegrenzung. Dies ist eine Aufgabe, die Sie rekursiv ausführen müssen.
quelle
a
ruft sich immer noch selbst auf, nur indirekt (durch Aufrufenb
).Rekursives Programmieren ist der Prozess, ein Problem schrittweise zu reduzieren, um Versionen von sich selbst leichter zu lösen.
Jede rekursive Funktion tendiert dazu:
Wenn Schritt 2 vor 3 liegt und Schritt 4 trivial ist (Verkettung, Summe oder nichts), wird die Schwanzrekursion aktiviert . Schritt 2 muss häufig nach Schritt 3 erfolgen, da die Ergebnisse der Unterdomäne (n) des Problems möglicherweise erforderlich sind, um den aktuellen Schritt abzuschließen.
Nimm die Durchquerung eines geradlinigen Binärbaums. Die Überquerung kann je nach Bedarf in Vorbestellung, Bestellung oder Nachbestellung erfolgen.
Vorbestellung: BAC
Bestellung: ABC
Nachbestellung: ACB
Sehr viele rekursive Probleme sind bestimmte Fälle einer Kartenoperation oder eine Falte. Wenn Sie nur diese beiden Operationen verstehen, können Sie wichtige Anwendungsfälle für die Rekursion verstehen.
quelle
Das OP sagte, dass Rekursion in der realen Welt nicht existiert, aber ich bitte, mich zu unterscheiden.
Nehmen wir die "Operation" der realen Welt, eine Pizza zu schneiden. Sie haben die Pizza aus dem Ofen genommen, und um sie zu servieren, müssen Sie sie halbieren, dann halbieren und dann wieder halbieren.
Der Vorgang des Schneidens der Pizza, den Sie immer wieder ausführen, bis Sie das gewünschte Ergebnis erhalten (die Anzahl der Scheiben). Und um der Sache willen sagen wir, dass eine ungeschnittene Pizza selbst ein Stück ist.
Hier ist ein Beispiel in Ruby:
Also schneidet die Operation in der realen Welt eine Pizza und die Rekursion macht immer wieder dasselbe, bis Sie haben, was Sie wollen.
Folgende Operationen können Sie mit rekursiven Funktionen implementieren:
Ich empfehle, ein Programm zu schreiben, um anhand des Dateinamens nach einer Datei zu suchen, und zu versuchen, eine Funktion zu schreiben, die sich selbst aufruft, bis sie gefunden wird. Die Signatur würde folgendermaßen aussehen:
find_file_by_name(file_name_we_are_looking_for, path_to_look_in)
Man könnte es also so nennen:
find_file_by_name('httpd.conf', '/etc') # damn it i can never find apache's conf
Meiner Meinung nach ist es einfach die Programmierung der Mechanik, eine Methode, um Duplikate auf clevere Weise zu entfernen. Sie können dies mithilfe von Variablen umschreiben, dies ist jedoch eine "schönere" Lösung. Es ist nichts Geheimnisvolles oder Schwieriges daran. Sie schreiben ein paar rekursive Funktionen, es klickt und huzzah einen weiteren mechanischen Trick in Ihrer Programmier- Toolbox .
Zusätzliches Guthaben Das
cut_pizza
obige Beispiel gibt Ihnen einen zu tiefen Fehler, wenn Sie nach einer Anzahl von Slices fragen, die keine Potenz von 2 sind (dh 2 oder 4 oder 8 oder 16). Können Sie es so ändern, dass es nicht für immer läuft, wenn jemand nach 10 Scheiben fragt?quelle
Okay, ich werde versuchen, dies einfach und prägnant zu halten.
Rekursive Funktionen sind Funktionen, die sich selbst aufrufen. Rekursive Funktionen bestehen aus drei Dingen:
Die beste Möglichkeit, rekursive Methoden zu schreiben, besteht darin, sich die Methode, die Sie schreiben möchten, als einfaches Beispiel vorzustellen und nur eine Schleife des Prozesses zu behandeln, über den Sie iterieren möchten. Anschließend fügen Sie den Aufruf der Methode selbst hinzu und fügen ihn hinzu, wann immer Sie möchten kündigen. Der beste Weg zu lernen ist, wie alle Dinge zu üben.
Da es sich um eine Programmierseite handelt, schreibe ich keinen Code, aber hier ist ein guter Link
Wenn Sie diesen Witz haben, wissen Sie, was Rekursion bedeutet.
quelle
Rekursion ist ein Tool, mit dem ein Programmierer einen Funktionsaufruf für sich selbst aufrufen kann. Die Fibonacci-Sequenz ist das Lehrbuchbeispiel für die Verwendung der Rekursion.
Der meiste rekursive Code, wenn nicht alle, kann als iterative Funktion ausgedrückt werden, ist jedoch normalerweise unübersichtlich. Gute Beispiele für andere rekursive Programme sind Datenstrukturen wie Bäume, Binärsuchbaum und sogar Quicksort.
Rekursion wird verwendet, um den Code weniger schlampig zu machen. Beachten Sie jedoch, dass er normalerweise langsamer ist und mehr Speicher benötigt.
quelle
Ich benutze diesen gerne:
Wie gehst du zum Laden?
Wenn Sie am Eingang des Ladens sind, gehen Sie einfach durch. Machen Sie andernfalls einen Schritt und gehen Sie dann den Rest des Weges zum Geschäft.
Es ist wichtig, drei Aspekte zu berücksichtigen:
Tatsächlich verwenden wir im täglichen Leben viel Rekursion. wir denken einfach nicht so darüber.
quelle
for
Schleife in eine sinnlose rekursive Funktion.Das beste Beispiel, auf das ich Sie hinweisen möchte, ist C Programming Language von K & R. In diesem Buch (und ich zitiere aus dem Gedächtnis) listet der Eintrag auf der Indexseite für Rekursion (allein) die tatsächliche Seite auf, auf der über Rekursion und Rekursion gesprochen wird die Indexseite auch.
quelle
Josh K erwähnte bereits die Matroschka- Puppen. Angenommen, Sie möchten etwas lernen, das nur die kürzeste Puppe kennt. Das Problem ist, dass man nicht direkt mit ihr sprechen kann, weil sie ursprünglich in der größeren Puppe lebt, die auf dem ersten Bild links von ihr steht. Diese Struktur funktioniert so (eine Puppe lebt in der größeren Puppe), bis sie nur noch die größte enthält.
Das Einzige, was Sie tun können, ist, Ihre Frage an die größte Puppe zu richten. Die größte Puppe (die die Antwort nicht kennt) muss Ihre Frage an die kürzere Puppe (die auf dem ersten Bild rechts zu sehen ist) weiterleiten. Da sie auch keine Antwort hat, muss sie die nächste kürzere Puppe fragen. Dies wird so lange gehen, bis die Nachricht die kürzeste Puppe erreicht. Die kürzeste Puppe (die einzige, die die geheime Antwort kennt) gibt die Antwort an die nächstgrößere Puppe (links zu finden) weiter, die sie an die nächstgrößere Puppe weitergibt ... und dies wird bis zur Antwort fortgesetzt erreicht sein endgültiges Ziel, welches die größte Puppe ist und endlich ... du :)
Dies ist, was Rekursion wirklich tut. Eine Funktion / Methode ruft sich selbst auf, bis sie die erwartete Antwort erhält. Wenn Sie rekursiven Code schreiben, ist es daher sehr wichtig zu entscheiden, wann die Rekursion beendet werden soll.
Nicht die beste Erklärung, aber es hilft hoffentlich.
quelle
Rekursion n. - Ein Muster des Algorithmusentwurfs, bei dem eine Operation in Bezug auf sich selbst definiert ist.
Das klassische Beispiel ist das Finden der Fakultät einer Zahl n !. 0! = 1 und für jede andere natürliche Zahl N ist die Fakultät von N das Produkt aller natürlichen Zahlen, die kleiner oder gleich N sind. Also, 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720. Mit dieser grundlegenden Definition können Sie eine einfache iterative Lösung erstellen:
Untersuchen Sie den Vorgang jedoch erneut. 6! = 6 * 5 * 4 * 3 * 2 * 1. Nach der gleichen Definition, 5! = 5 * 4 * 3 * 2 * 1, was bedeutet, dass wir 6 sagen können! = 6 * (5!). 5! = 5 * (4!) Und so weiter. Auf diese Weise reduzieren wir das Problem auf eine Operation, die mit dem Ergebnis aller vorherigen Operationen ausgeführt wird. Dies reduziert sich schließlich auf einen Punkt, der als Basisfall bezeichnet wird und dessen Ergebnis per Definition bekannt ist. In unserem Fall ist 0! = 1 (wir könnten in den meisten Fällen auch 1! = 1 sagen). Beim Rechnen dürfen wir Algorithmen oft auf sehr ähnliche Weise definieren, indem wir die Methode selbst aufrufen und eine kleinere Eingabe übergeben, wodurch das Problem durch viele Rekursionen auf einen Basisfall reduziert wird:
Dies kann in vielen Sprachen mithilfe des ternären Operators weiter vereinfacht werden (manchmal als Iif-Funktion in Sprachen angesehen, die den Operator nicht als solchen bereitstellen):
Vorteile:
Nachteile:
quelle
Das Beispiel, das ich benutze, ist ein Problem, mit dem ich im wirklichen Leben konfrontiert war. Sie haben einen Container (z. B. einen großen Rucksack, den Sie auf Reisen mitnehmen möchten) und möchten das Gesamtgewicht wissen. In dem Container befinden sich zwei oder drei lose Gegenstände und einige andere Container (z. B. Packsäcke). Das Gewicht des Gesamtcontainers ist offensichtlich das Gewicht des leeren Containers plus das Gewicht von allem, was sich darin befindet. Für die losen Gegenstände können Sie sie einfach wiegen, und für die Packsäcke können Sie sie einfach wiegen oder sagen: "Nun, das Gewicht jedes Packsacks ist das Gewicht des leeren Behälters plus das Gewicht von allem, was sich darin befindet." Und dann geht man weiter in Container in Container und so weiter, bis man zu einem Punkt kommt, an dem sich nur noch lose Gegenstände in einem Container befinden. Das ist Rekursion.
Sie denken vielleicht, dass dies im wirklichen Leben niemals passiert, aber stellen Sie sich vor, Sie versuchen, die Gehälter von Personen in einem bestimmten Unternehmen oder Geschäftsbereich zu zählen oder zu addieren Die Abteilungen dort sind Abteilungen und so weiter. Oder Verkäufe in einem Land mit Regionen, von denen einige Unterregionen usw. haben. Solche Probleme treten im Geschäftsleben immer wieder auf.
quelle
Rekursion kann verwendet werden, um viele Zählprobleme zu lösen. Angenommen, Sie haben eine Gruppe von n Personen auf einer Party (n> 1), und jeder schüttelt genau einmal die Hand jedes anderen. Wie viele Handshakes finden statt? Sie können wissen, dass die Lösung C (n, 2) = n (n-1) / 2 ist, aber Sie können rekursiv wie folgt lösen:
Angenommen, es gibt nur zwei Personen. Dann ist die Antwort (durch Inspektion) offensichtlich 1.
Angenommen, Sie haben drei Personen. Ermitteln Sie eine Person, und beachten Sie, dass sie zwei anderen Personen die Hand gibt. Danach müssen Sie nur noch die Handshakes zwischen den beiden anderen Personen zählen. Das haben wir jetzt schon gemacht und es ist 1. Die Antwort lautet also 2 + 1 = 3.
Angenommen, Sie haben n Personen. Nach der gleichen Logik wie zuvor ist es (n-1) + (Anzahl der Handshakes zwischen n-1 Personen). Wenn wir expandieren, erhalten wir (n-1) + (n-2) + ... + 1.
Ausgedrückt als rekursive Funktion,
f (2) = 1
f (n) = n - 1 + f (n - 1), n> 2
quelle
Im Leben kommt es (im Gegensatz zu einem Computerprogramm) selten zu einer Rekursion unter unserer direkten Kontrolle, da es verwirrend sein kann, dies zu erreichen. Bei der Wahrnehmung geht es in der Regel eher um die Nebenwirkungen als um die Funktionsreinheit. Wenn also eine Rekursion auftritt, bemerken Sie diese möglicherweise nicht.
Rekursion findet hier auf der Welt statt. Viel.
Ein gutes Beispiel ist (in vereinfachter Form) der Wasserkreislauf:
Dies ist ein Zyklus, der dazu führt, dass sein Selbst wieder passiert. Es ist rekursiv.
Ein weiterer Ort, an dem Sie eine Rekursion erhalten können, ist Englisch (und die menschliche Sprache im Allgemeinen). Sie werden es vielleicht zunächst nicht erkennen, aber die Art und Weise, wie wir einen Satz erzeugen, ist rekursiv, da wir nach den Regeln eine Instanz eines Symbols in eine andere Instanz desselben Symbols einbetten können.
Aus Steven Pinkers Sprachinstinkt:
Das ist ein ganzer Satz, der andere ganze Sätze enthält:
Der Vorgang des Verstehens des vollständigen Satzes beinhaltet das Verstehen kleinerer Sätze, bei denen die gleichen mentalen Tricks angewendet werden, um als vollständiger Satz verstanden zu werden.
Um die Rekursion aus programmtechnischer Sicht zu verstehen, ist es am einfachsten, sich ein Problem anzusehen, das mit der Rekursion gelöst werden kann, und zu verstehen, warum dies der Fall sein sollte und was dies bedeutet.
Für das Beispiel verwende ich die größte gemeinsame Divisor-Funktion, kurz gcd.
Du hast deine beiden Nummern
a
undb
. Um ihre gcd zu finden (vorausgesetzt, keine von beiden ist 0), müssen Sie prüfen, ob siea
gleichmäßig in geteilt werden könnenb
. Wenn diesb
der Fall ist, müssen Sie nach dem GCDb
und dem Rest von suchena/b
.Sie sollten bereits erkennen können, dass dies eine rekursive Funktion ist, da Sie die gcd-Funktion haben, die die gcd-Funktion aufruft. Nur um es nach Hause zu hämmern, hier ist es in c # (wieder unter der Annahme, dass 0 nie als Parameter übergeben wird):
In einem Programm ist es wichtig, eine Stoppbedingung zu haben, andernfalls wird Ihre Funktion für immer wiederkehren, was schließlich zu einem Stapelüberlauf führt!
Der Grund für die Verwendung der Rekursion anstelle einer while-Schleife oder eines anderen iterativen Konstrukts besteht darin, dass Sie beim Lesen des Codes erfahren, was getan wird und was als Nächstes passieren wird, sodass Sie leichter herausfinden können, ob der Code ordnungsgemäß funktioniert .
quelle
Hier ist ein reales Beispiel für die Rekursion.
Stellen Sie sich vor, Sie haben eine Comic-Sammlung und Sie mischen alles zu einem großen Haufen. Achtung - wenn sie wirklich eine Sammlung haben, können sie Sie sofort töten, wenn Sie nur die Idee erwähnen, dies zu tun.
Lassen Sie sie nun diesen großen unsortierten Stapel Comics mit Hilfe dieses Handbuchs sortieren:
Das Schöne dabei ist: Wenn es nur um einzelne Ausgaben geht, haben sie den vollen "Stapelrahmen" mit den lokalen Pfählen, die vor ihnen auf dem Boden sichtbar sind. Geben Sie ihnen mehrere Ausdrucke des Handbuchs und legen Sie einen neben jede Stapelebene mit einer Markierung, auf der Sie sich gerade befinden (dh den Status der lokalen Variablen), damit Sie dort bei jedem Abschluss fortfahren können.
Das ist es, worum es bei der Rekursion im Grunde geht: Je mehr Sie sich damit befassen, desto detaillierter wird derselbe Prozess ausgeführt.
quelle
Rekursion ist eine sehr präzise Methode, um etwas auszudrücken, das wiederholt werden muss, bis etwas erreicht ist.
quelle
Kein einfaches Englisch, keine Beispiele aus dem wirklichen Leben, sondern zwei Möglichkeiten, Rekursion durch Spielen zu lernen:
quelle
Eine schöne Erklärung der Rekursion ist wörtlich "eine Aktion, die von selbst wieder auftritt".
Stellen Sie sich einen Maler vor, der eine Wand malt. Das ist rekursiv, weil die Aktion darin besteht, "einen Streifen von Decke zu Boden zu malen, als ein wenig nach rechts zu rutschen, und (einen Streifen von Decke zu Boden zu malen, als ein wenig nach rechts zu rutschen, und (a streifen Sie von der Decke zum Boden als scoot über ein wenig nach rechts und (etc))) ".
Seine paint () -Funktion ruft sich immer wieder auf, um seine größere paint_wall () -Funktion zu bilden.
Hoffentlich hat dieser arme Maler eine Art Abbruchbedingung :)
quelle