Fast jeder Artikel, den ich über Rekursion finden kann, enthält Beispiele für Fakultäts- oder Fibonacci-Zahlen:
- Mathematik
- Nutzlos im wirklichen Leben
Gibt es einige interessante nicht-mathematische Codebeispiele , um die Rekursion zu lehren?
Ich denke an Divide-and-Conquer-Algorithmen, aber diese beinhalten normalerweise komplexe Datenstrukturen.
Antworten:
Verzeichnis- / Dateistrukturen sind das beste Beispiel für eine Verwendung für die Rekursion, da jeder sie versteht, bevor Sie beginnen, aber alles, was baumähnliche Strukturen umfasst, reicht aus.
quelle
Suchen Sie nach Dingen, die Baumstrukturen betreffen. Ein Baum ist relativ einfach zu erfassen, und die Schönheit einer rekursiven Lösung wird viel früher sichtbar als bei linearen Datenstrukturen wie Listen.
Dinge, über die man nachdenken sollte:
Diese beziehen sich alle auf reale Szenarien und können in Anwendungen von realer Bedeutung verwendet werden.
quelle
https://stackoverflow.com/questions/105838/real-world-examples-of-recursion
https://stackoverflow.com/questions/2085834/how-did-you-practically-use-recursion
https://stackoverflow.com/questions/4945128/what-is-a-good-example-of-recursion-other-than-generating-a-fibonacci-sequence
https://stackoverflow.com/questions/126756/examples-of-recursive-functions
quelle
Hier sind einige weitere praktische Probleme, die mir einfallen:
quelle
QuickSort wäre der erste, der mir in den Sinn kommt. Die binäre Suche ist ebenfalls ein rekursives Problem. Darüber hinaus gibt es eine ganze Reihe von Problemen, bei denen Lösungen fast kostenlos herausfallen, wenn Sie mit der Rekursion beginnen.
quelle
In Python rekursiv definierte Sortierung.
Zusammenführen, rekursiv definiert.
Lineare Suche, rekursiv definiert.
Binäre Suche, rekursiv definiert.
quelle
In gewissem Sinne geht es bei der Rekursion darum, Lösungen zu teilen und zu erobern, dh den Problemraum in einen kleineren zu unterteilen, um die Lösung für ein einfaches Problem zu finden, und dann in der Regel das ursprüngliche Problem zu rekonstruieren, um die richtige Antwort zu erhalten.
Einige Beispiele, bei denen es nicht um Mathematik geht, um Rekursion zu lehren (zumindest die Probleme, an die ich mich aus meiner Studienzeit erinnere):
Dies sind Beispiele für die Verwendung von Backtracking, um das Problem zu lösen.
Andere Probleme sind die Klassiker der Domäne der künstlichen Intelligenz: Verwendung der Tiefensuche, Pfadfindung, Planung.
Bei all diesen Problemen handelt es sich um eine Art "komplexe" Datenstruktur. Wenn Sie sie jedoch nicht mit Mathematik (Zahlen) unterrichten möchten, sind Ihre Auswahlmöglichkeiten möglicherweise eingeschränkter. Vielleicht möchten Sie mit einer grundlegenden Datenstruktur wie einer verknüpften Liste anfangen zu unterrichten. Zum Beispiel die natürlichen Zahlen mit einer Liste darstellen:
0 = leere Liste 1 = Liste mit einem Knoten. 2 = Liste mit 2 Knoten. ...
Definieren Sie dann die Summe zweier Zahlen in Bezug auf diese Datenstruktur wie folgt: Leer + N = N Knoten (X) + N = Knoten (X + N)
quelle
Die Türme von Hanoi eignen sich gut zum Erlernen der Rekursion.
Es gibt viele Lösungen im Web in vielen verschiedenen Sprachen.
quelle
Ein Palindrom-Detektor:
Beginnen Sie mit einer Zeichenfolge: "ABCDEEDCBA" Wenn Start- und Endzeichen gleich sind, überprüfen Sie "BCDEEDCB" usw.
quelle
Ein binärer Suchalgorithmus klingt wie das, was Sie wollen.
quelle
Wenn in funktionalen Programmiersprachen keine Funktionen höherer Ordnung verfügbar sind, wird anstelle von imperativen Schleifen eine Rekursion verwendet, um einen veränderlichen Zustand zu vermeiden.
F # ist eine unreine funktionale Sprache, die beide Stile erlaubt, also werde ich beide hier vergleichen. Die folgende Summe aller Zahlen in einer Liste.
Imperative Schleife mit veränderlicher Variable
Rekursive Schleife ohne veränderlichen Zustand
Beachten Sie, dass diese Art der Aggregation wird in der Funktion höherer Ordnung erfasst
List.fold
und können so geschrieben werdenList.fold (+) 0 xlist
oder sogar noch einfacher mit der KomfortfunktionList.sum
als nurList.sum xlist
.quelle
Ich habe die Rekursion beim Spielen von KI stark genutzt. Beim Schreiben in C ++ habe ich eine Reihe von ungefähr 7 Funktionen verwendet, die sich nacheinander aufrufen (wobei die erste Funktion die Option hat, alle diese Funktionen zu umgehen und stattdessen eine Kette von zwei weiteren Funktionen aufzurufen). Die letzte Funktion in beiden Ketten rief die erste Funktion erneut auf, bis die verbleibende Tiefe, die ich suchen wollte, auf 0 ging. In diesem Fall rief die letzte Funktion meine Bewertungsfunktion auf und gab die Punktzahl der Position zurück.
Die verschiedenen Funktionen ermöglichten es mir, einfach nach Spielerentscheidungen oder zufälligen Ereignissen im Spiel zu verzweigen. Ich habe immer Pass-by-Reference verwendet, da ich sehr große Datenstrukturen durchlief. Aufgrund der Struktur des Spiels war es jedoch sehr schwierig, bei meiner Suche einen "Rückgängig" -Zug zu machen In einigen Funktionen verwende ich die Übergabe von Werten, um meine ursprünglichen Daten unverändert zu lassen. Aus diesem Grund erwies sich die Umstellung auf einen schleifenbasierten Ansatz anstelle eines rekursiven Ansatzes als zu schwierig.
Eine sehr grundlegende Übersicht über diese Art von Programm finden Sie unter https://secure.wikimedia.org/wikipedia/en/wiki/Minimax#Pseudocode
quelle
Ein wirklich gutes Beispiel aus dem Geschäftsleben ist die sogenannte "Stückliste". Dies sind die Daten, die alle Komponenten darstellen, aus denen ein fertiges Produkt besteht. Nehmen wir zum Beispiel ein Fahrrad. Ein Fahrrad hat Lenker, Räder, einen Rahmen usw. Und jede dieser Komponenten kann Unterkomponenten haben. Beispielsweise kann das Rad Speichen, einen Ventilschaft usw. aufweisen. Diese werden also normalerweise in einer Baumstruktur dargestellt.
Wenn Sie jetzt aggregierte Informationen zur Stückliste abfragen oder Elemente in einer Stückliste ändern möchten, greifen Sie häufig auf eine Rekursion zurück.
Und ein Beispiel für einen rekursiven Aufruf ...
Offensichtlich würde die BomPart-Klasse viel, viel mehr Felder haben. Möglicherweise müssen Sie herausfinden, wie viele Kunststoffteile Sie haben, wie viel Arbeit Sie benötigen, um ein komplettes Teil zu erstellen usw. All dies kommt jedoch auf die Nützlichkeit von Rekursion an einer Baumstruktur zurück.
quelle
Familienbeziehungen sind gute Beispiele, weil jeder sie intuitiv versteht:
quelle
||
für dieOR
.Ein eher nutzloses, aber dennoch rekursives Inner Working Well ist rekursiv
strlen()
:Keine Mathematik - eine sehr einfache Funktion. Natürlich implementieren Sie es nicht rekursiv im realen Leben, aber es ist eine gute Demo der Rekursion.
quelle
Ein weiteres reales Rekursionsproblem, mit dem sich die Schüler möglicherweise befassen, besteht darin, einen eigenen Webcrawler zu erstellen, der Informationen von einer Website abruft und allen Links auf dieser Website (und allen Links von diesen Links usw.) folgt.
quelle
Ich habe ein Problem mit einem Rittermuster (auf einem Schachbrett) mit einem rekursiven Programm gelöst. Sie sollten den Ritter so bewegen, dass er jedes Feld mit Ausnahme einiger markierter Felder berührt.
Sie einfach:
Viele Arten von "Vorausdenken" -Szenarien können bearbeitet werden, indem zukünftige Möglichkeiten in einem Baum wie diesem getestet werden.
quelle