| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |
| modul:m323:learningunits:lu03:rekursion [2026/08/25 09:54] – Korrektur fibonacci(6) = 8 (nicht 5) + Animation zu Call Stack und Aufrufbaum admin | modul:m323:learningunits:lu03:rekursion [2026/09/01 09:48] (aktuell) – Neuer Abschnitt: Rekursion in der Praxis (Real-World-Anwendungen) admin |
|---|
| </WRAP> | </WRAP> |
| |
| <WRAP center round info 60%> | ===== Rekursion in der Praxis ===== |
| Rekursion ist eine mächtige Technik, die in vielen verschiedenen Problembereichen eingesetzt werden kann. Durch das Verständnis des Basisfalls und des rekursiven Falls können Sie rekursive Funktionen erstellen, um eine Vielzahl von Problemen auf eine klare und elegante Weise zu lösen. | |
| | Fakultät und Fibonacci sind gute Lernbeispiele, aber ehrliche Praxis sind sie nicht: Beide löst man in echtem Code meist mit einer Schleife. Die berechtigte Frage lautet also: **Wozu braucht man Rekursion überhaupt?** |
| | |
| | <WRAP center round info 90%> |
| | **Die Faustregel:** Rekursion lohnt sich dort, wo die **Datenstruktur oder das Problem selbst verschachtelt** ist – wo also ein Ding wieder Dinge derselben Art enthält. Dann bildet der Code einfach die Form der Daten ab. Ist die Struktur dagegen flach (eine Liste, ein Zähler), ist eine Schleife klarer. |
| </WRAP> | </WRAP> |
| | |
| | ==== Verschachtelte Datenstrukturen ==== |
| | |
| | * **Dateisystem:** Ein Ordner enthält Dateien //und weitere Ordner//. Jede Suche, jede Grössenberechnung, jedes Backup-Tool und jedes ''os.walk()'' arbeitet rekursiv. |
| | * **JSON, XML, HTML:** Ein Objekt enthält Objekte, ein ''<div>'' enthält weitere ''<div>''. Jeder Parser und jeder Browser traversiert diese Bäume rekursiv. |
| | * **Organigramme und Stücklisten:** „Wer sind alle Mitarbeitenden unter dieser Person?" oder die Stücklistenauflösung im ERP – ein Bauteil besteht aus Bauteilen, die wieder aus Bauteilen bestehen. |
| | * **Kommentarbäume:** Antworten auf Antworten auf Kommentare, wie sie jedes Forum darstellt. |
| | |
| | ==== Divide & Conquer ==== |
| | |
| | Ein grosses Problem wird in gleichartige kleinere zerlegt: |
| | |
| | * **Quicksort und Mergesort** – sortiere die zwei Hälften, füge sie zusammen. |
| | * **Binäre Suche** – halbiere den Suchbereich, suche weiter in der richtigen Hälfte. |
| | * **Kompression** – der Huffman-Baum wird rekursiv aufgebaut und ausgelesen. |
| | |
| | ==== Suchen und Ausprobieren (Backtracking) ==== |
| | |
| | * **Sudoku- und Labyrinth-Löser:** Setze einen Wert, versuche rekursiv weiterzukommen, nimm bei einer Sackgasse den Zug zurück. |
| | * **Spiele-KI:** Der Minimax-Algorithmus im Schach fragt rekursiv „Was tue ich, wenn der Gegner das tut, worauf ich jenes tue …?" |
| | * **Routenplanung:** Die Tiefensuche in einem Graphen ist von Natur aus rekursiv. |
| | |
| | ==== Weitere Beispiele ==== |
| | |
| | * **Ray-Tracing:** Trifft ein Lichtstrahl auf einen Spiegel, wird ein neuer Strahl verfolgt – dieselbe Funktion, neuer Startpunkt. |
| | * **Fraktale und Terrain-Generierung:** Landschaften in Spielen entstehen, indem eine Fläche immer wieder in kleinere, ähnliche Flächen unterteilt wird. |
| | * **Benutzeroberflächen:** Frameworks wie React oder Vue rendern ihren Komponentenbaum rekursiv – eine Komponente enthält Komponenten. |
| | |
| | <WRAP center round tip 90%> |
| | **Der Zusammenhang zur funktionalen Programmierung:** In der funktionalen Programmierung ersetzt Rekursion die Schleife vollständig, weil es keine veränderbare Zählvariable geben soll. Rekursion ist dort also nicht nur eine Option für Sonderfälle, sondern das Standardwerkzeug für Wiederholung. |
| | </WRAP> |
| | |
| | Die Aufgabe [[modul:m323:learningunits:lu03:aufgaben:verzeichnisbaum|LU03.A01 - Rekursive Suche in einem Verzeichnisbaum]] greift den ersten Fall direkt auf: eine verschachtelte Struktur, bei der eine Schleife nicht ausreicht. |
| |
| ---- | ---- |