Um die Rekursion zu erklären , verwende ich eine Kombination verschiedener Erklärungen, normalerweise um beide zu versuchen:
- das Konzept erklären,
- erklären, warum es wichtig ist,
- Erklären Sie, wie Sie es bekommen.
Für den Anfang definiert Wolfram | Alpha es in einfacheren Begriffen als Wikipedia :
Ein Ausdruck, bei dem jeder Term durch Wiederholen einer bestimmten mathematischen Operation generiert wird.
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:
- eine mathematische Funktion ...
- ... der sich selbst aufruft, um einen Wert zu berechnen, der einem n-ten Element entspricht ...
- ... und welche Grenzen definiert.
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 druckt printf
. 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:
- Die Fibonacci- Zahlen,
- Der größte gemeinsame Teiler ,
- Das 8-Damen- Problem,
- Die Türme von Hanoi Spiel,
- Und wenn Sie eine grafische Umgebung haben (oder Code-Stubs dafür oder für eine Terminal-Ausgabe bereitstellen können oder diese bereits verwalten können), sind folgende Dinge zu beachten:
- Und für praktische Beispiele sollten Sie folgendes schreiben:
- ein Baumdurchlaufalgorithmus,
- ein einfacher Parser für mathematische Ausdrücke,
- ein Minensuchspiel.
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:
- GNU - "GNU ist nicht Unix"
- Nagios - "Nagios wird nicht auf Heiligkeit bestehen"
- PHP - "PHP Hypertext Preprocessor" (und ursprünglich "Personal Home Page")
- Wein - "Wein ist kein Emulator"
- Zile - "Zile ist verlustreicher Emacs"
Gegenseitig rekursiv:
- HURD - "HIRD of Unix-Replacing Daemons" (wobei HIRD "HURD of Interfaces" für Depth steht)
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 die n
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)
wo g(x) = f(x) + l(x)
und h
und l
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 .