schule:rekursion
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| schule:rekursion [2017-12-11 18:09] – [Übung Streckenalgorithmus] +python algo marco.bakera | schule:rekursion [2024-01-20 08: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> | + | |
| - | 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> | + | |
| - | anzahl(liste): | + | |
| - | if liste ist leer: | + | |
| - | return 0 | + | |
| - | + | ||
| - | else: | + | |
| - | liste_kleiner = liste.entferneErstesElement() | + | |
| - | 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, | + | |
| - | + | ||
| - | </ | + | |
| - | + | ||
| - | ===== Live Coding mit Fluxus ===== | + | |
| - | + | ||
| - | Die Programmierumgebung [[live_coding# | + | |
| - | + | ||
| - | < | + | |
| - | <iframe width=" | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Ü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] | + | |
| - | </ | + | |
| - | + | ||
| - | ===== 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.1513015795.txt.gz · Zuletzt geändert: von marco.bakera
