schule:rekursion
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
schule:rekursion [2019-12-09 15:33] – [Beispiel: Anzahl Elemente einer Liste] marco.bakera | schule:rekursion [2024-01-20 09:39] (aktuell) – mv pintman | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== Rekursion ====== | + | Verschoben |
- | + | ||
- | {{: | + | |
- | + | ||
- | Die Rekursion beschreibt in der Programmierung das Phänomen, wenn eine Methode sich selbst aufruft. | + | |
- | + | ||
- | **Ein Algorithmus ist rekursiv, wenn er mit Hilfe einfacher Varianten von sich selbst beschrieben wird.** | + | |
- | + | ||
- | <code python> | + | |
- | loese(< | + | |
- | ... | + | |
- | | + | |
- | ... | + | |
- | </ | + | |
- | + | ||
- | Das sieht zunächst seltsam aus, kann sich aber in vielen Situationen als nützlich erweisen. | + | |
- | + | ||
- | ===== Allgemeiner Aufbau ===== | + | |
- | + | ||
- | Eine rekursive Funktion oder Methode ist häufig | + | |
- | + | ||
- | <code python> | + | |
- | REKURSIVE_METHODE(< | + | |
- | if <das Problem ist leicht>: | + | |
- | <löse das Problem> | + | |
- | else: | + | |
- | <mache das Problem leichter> | + | |
- | REKURSIVE_METHODE(< | + | |
- | </ | + | |
- | + | ||
- | **Jeder rekursive Algorithmus muss eine Abbruchbedingung enthalten.** | + | |
- | + | ||
- | ===== Beispiel: Anzahl Elemente einer Liste ===== | + | |
- | + | ||
- | + | ||
- | Ein Beispiel soll dies veranschaulichen: | + | |
- | + | ||
- | <code python> | + | |
- | def anzahl(liste): | + | |
- | anzahl = 0 | + | |
- | for element in liste: | + | |
- | anzahl = anzahl + 1 | + | |
- | + | ||
- | return anzahl | + | |
- | </ | + | |
- | + | ||
- | Ein rekursiver Algorithmus würde das Problem wie folgt lösen: | + | |
- | + | ||
- | <code python> | + | |
- | def anzahl(liste): | + | |
- | if liste ist leer: | + | |
- | return 0 | + | |
- | + | ||
- | else: | + | |
- | liste_kleiner = liste[1:] # entferne erstes Element | + | |
- | return 1 + anzahl(liste_kleiner) | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | ===== Übung Ausgabe ===== | + | |
- | + | ||
- | Alle Elemente einer Liste sollen mit der Methode '' | + | |
- | + | ||
- | <code python> | + | |
- | + | ||
- | >>> | + | |
- | 1 | + | |
- | 2 | + | |
- | 3 | + | |
- | >>> | + | |
- | 1 | + | |
- | </ | + | |
- | ===== Übung rekursive Suche ===== | + | |
- | + | ||
- | Wie sieht ein rekursiver Algorithmus '' | + | |
- | + | ||
- | < | + | |
- | >>> | + | |
- | True | + | |
- | + | ||
- | >>> | + | |
- | True | + | |
- | + | ||
- | >>> | + | |
- | True | + | |
- | + | ||
- | >>> | + | |
- | False | + | |
- | </ | + | |
- | + | ||
- | ===== Übung Filtern ===== | + | |
- | + | ||
- | Schreibe einen rekursiven Algorithmus, | + | |
- | + | ||
- | < | + | |
- | >>> | + | |
- | [2] | + | |
- | + | ||
- | >>> | + | |
- | [4, 2] | + | |
- | + | ||
- | >>> | + | |
- | [4] | + | |
- | + | ||
- | >>> | + | |
- | [] | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | ===== Übung Streckenalgorithmus ===== | + | |
- | + | ||
- | {{:schule: | + | |
- | + | ||
- | In den [[https:// | + | |
- | + | ||
- | Wie sieht der einfache Fall aus? | + | |
- | + | ||
- | Vervollständige den folgenden Algorithmus zum Zeichnen einer Strecke. | + | |
- | + | ||
- | <code python> | + | |
- | from tkinter import * | + | |
- | + | ||
- | class App: | + | |
- | def __init__(self): | + | |
- | fenster = Tk() | + | |
- | + | ||
- | self.canv = Canvas(fenster, | + | |
- | self.canv.pack() | + | |
- | + | ||
- | self.strecke(10, | + | |
- | fenster.mainloop() | + | |
- | + | ||
- | def markiere(self, | + | |
- | self.canv.create_rectangle(x, | + | |
- | + | ||
- | + | ||
- | def strecke(self, | + | |
- | # Hier muss eine Strecke rekursiv gezeichnet werden | + | |
- | # if Punkte a und b benachbart: | + | |
- | # | + | |
- | # else: | + | |
- | # | + | |
- | # | + | |
- | # | + | |
- | pass | + | |
- | + | ||
- | app = App() | + | |
- | </ | + | |
- | + | ||
- | ===== Übung Kochkurve ===== | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | Eine weitere Anwendung von Rekursion | + | |
- | + | ||
- | Verwende die folgende Vorlage und zeichne damit eine Kochkurve. | + | |
- | + | ||
- | <code python kockurve.py> | + | |
- | import turtle | + | |
- | + | ||
- | """ | + | |
- | Die Turtle kann mit folgenden Befehlen bewegt werden: | + | |
- | + | ||
- | tutle.forward(distanz) bewegt die Schildkröte in Blickrichtung | + | |
- | turtle.right(winkel) dreht die Schildkröte nach rechts. | + | |
- | tirtle.left(winkel) dreht die Schildkröte nach links. | + | |
- | """ | + | |
- | + | ||
- | def kochkurve(laenge, | + | |
- | """ | + | |
- | laenge beschreibt die Länge des aktuellen Streckenabschnitts | + | |
- | tiefe steht für die Rekursionstiefe.""" | + | |
- | if tiefe == 0: | + | |
- | """ | + | |
- | else: | + | |
- | """ | + | |
- | drehe nach rechts, zeichne erneut, drehe nach links und zeichne den Schluss. | + | |
- | _/\_ """ | + | |
- | + | ||
- | # Starte das Programm | + | |
- | turtle.reset() | + | |
- | turtle.speed(5) | + | |
- | + | ||
- | kochkurve(300, | + | |
- | + | ||
- | </ | + | |
- | + | ||
- | ===== Übung Grundrechenarten ===== | + | |
- | + | ||
- | Auch die Grundrechenarten '' | + | |
- | + | ||
- | add(0, m) = 0 + m = m | + | |
- | add(n, m) = n + m = ((n-1) + m) +1 | + | |
- | + | ||
- | mult(0, m) = 0 * m = 0 | + | |
- | mult(n, m) = n *m = (n-1)*m + m = add( mult(n-1, m), m) | + | |
- | + | ||
- | Programmiere die Methoden '' | + | |
- | ===== Übung Türme von Hanoi ===== | + | |
- | + | ||
- | {{: | + | |
- | + | ||
- | Unterschiedlich große Scheiben sind der Größe nach auf einem Stab platziert. Es gibt drei Stäbe A, B und C. Alle Scheiben müssen von Stab A nach C bewegt werden. Es darf immer nur eine Scheibe bewegt werden. Eine Scheibe darf nur auf eine größeren Scheibe platziert werden. | + | |
- | + | ||
- | Am besten probierst du das [[http:// | + | |
- | + | ||
- | Ein möglicher Algorithmus, | + | |
- | + | ||
- | < | + | |
- | bewege(Zahl i, Stab a, Stab b, Stab c) | + | |
- | if i == 0: | + | |
- | < | + | |
- | else: | + | |
- | | + | |
- | | + | |
- | | + | |
- | </ | + | |
- | + | ||
- | Ein [[https:// | + | |
- | + | ||
- | ===== Übung Flachklopfen ===== | + | |
- | + | ||
- | Die Methode '' | + | |
- | + | ||
- | < | + | |
- | >>> | + | |
- | [1,2,3] | + | |
- | + | ||
- | >>> | + | |
- | [1,2,3] | + | |
- | + | ||
- | >>> | + | |
- | [1,2,3] | + | |
- | + | ||
- | >>> | + | |
- | [1,2,3] | + | |
- | + | ||
- | >>> | + | |
- | [1,2,3] | + | |
- | </ | + | |
- | + | ||
- | ===== Übung umdrehen ===== | + | |
- | + | ||
- | Die Methode '' | + | |
- | + | ||
- | < | + | |
- | >>> | + | |
- | [] | + | |
- | >>> | + | |
- | [3, 2, 1] | + | |
- | </ | + | |
- | + | ||
- | ===== Live Coding mit Fluxus ===== | + | |
- | + | ||
- | Die Programmierumgebung [[live_coding# | + | |
- | + | ||
- | < | + | |
- | <iframe width=" | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | ===== Probleme rekursiver Algorithmen ===== | + | |
- | + | ||
- | Rekursive Algorithmen sind häufig elegant und kurz, manchmal aber auch schwer zu verstehen. Nicht immer sind sie das richtige Mittel der Wahl, obwohl manche Programmiersprachen vollständig auf Rekursion setzen. | + | |
- | + | ||
- | * Hoher Speicherplatzbedarf - Jeder Aufruf benötigt Speicherplatz für lokale Variablen | + | |
- | * Unendliche Rekursion - Wenn man nicht aufpasst, enden die rekursiven niemals. | + | |
- | ===== Rekursive Abkürzungen ===== | + | |
- | + | ||
- | Auch in anderen Gebieten der Informatik hat sich die Rekursion etabliert. So gibt es [[wpde> | + | |
- | + | ||
- | * PHP (PHP Hypertext Preprocessor) | + | |
- | * LAME (LAME Ain’t an Mp3 Encoder) | + | |
- | * WINE (WINE Is Not an Emulator) | + | |
- | * YAML (YAML Ain't Markup Language) | + | |
- | + | ||
- | ===== Links ===== | + | |
- | + | ||
- | * [[https:// | + | |
- | * [[https:// | + |
schule/rekursion.1575902036.txt.gz · Zuletzt geändert: 2019-12-09 15:33 von marco.bakera