Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| lehrkraefte:snr:informatik:glf22:python:rekursion [2022/12/23 11:12] – [Aufgabe zur Rekursion: Koch-Kurve und kochsche Schneeflocke] Olaf Schnürer | lehrkraefte:snr:informatik:glf22:python:rekursion [2022/12/23 21:32] (current) – [Einführung am Beispiel] Olaf Schnürer | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ~~NOTOC~~ | ||
| + | |||
| + | ====== Rekursion: (Weihnachts-)Bäume und Schneeflocken ====== | ||
| + | |||
| + | ===== Einführung am Beispiel ===== | ||
| + | |||
| + | <WRAP center round todo 100%> | ||
| + | Gemeinsames angeleitetes Programmieren: | ||
| + | |||
| + | <hidden Anweisung für Lehrer:> | ||
| + | Sukzessive die Funktionen '' | ||
| + | Alle Funktionen haben die aktuelle Streckenlänge als Parameter '' | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | |||
| + | Programm-Gerüst: | ||
| + | |||
| + | <code python baum.py> | ||
| + | from turtle import * | ||
| + | |||
| + | STAMMLAENGE = 380 | ||
| + | |||
| + | speed(0) | ||
| + | # hideturtle() | ||
| + | penup() | ||
| + | left(90) | ||
| + | backward(STAMMLAENGE) | ||
| + | pendown() | ||
| + | |||
| + | exitonclick() | ||
| + | |||
| + | # Um die Zeichung schneller erscheinen zu lassen, | ||
| + | # gibt es den folgenden Trick: | ||
| + | # Ersetze die Zeile '' | ||
| + | # und ergänze in der Zeile vor '' | ||
| + | # also nach allen Zeichenbefehlen, | ||
| + | </ | ||
| + | |||
| + | Experimentiere: | ||
| + | * Für welche Verzweigungswinkel kommt eine besonders schöne Figur heraus? (Es gibt zwei " | ||
| + | * Nimm statt 3 Verzweigungen eine andere Zahl von Verzweigungen. | ||
| + | * Zeichne jede der Verzweigungen unterschiedlich lang. | ||
| + | * Variiere die Winkel bei den rekursiven Aufrufen; nett ist es beispielsweise, | ||
| + | * Wer will, kann auch bereits hier eine Schleife über gewisse Verzweigungswinkel laufen lassen (auch wenn das eigentlich erst unten in der Animationsaufgabe vorgeschlagen wird...) | ||
| + | * Sei kreativ! | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info> | ||
| + | Eine Funktion heisst **rekursiv**, | ||
| + | |||
| + | **Rekursion** meint in der Informatik (und ähnlich in der Mathematik) den Einsatz rekursiver Funktionen. | ||
| + | |||
| + | Etymologie: lateinisch // | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe zur Rekursion: Koch-Kurve und kochsche Schneeflocke ===== | ||
| + | |||
| + | |||
| + | <WRAP center round todo> | ||
| + | Schreibe eine rekursive Funktion, die je nach " | ||
| + | |||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | |||
| + | Programm-Gerüst: | ||
| + | <code python koch-kurve.py> | ||
| + | from turtle import * | ||
| + | |||
| + | LEVEL = 3 | ||
| + | SEITENLAENGE = 400 | ||
| + | |||
| + | def kochkurve(level, | ||
| + | # " | ||
| + | # die Schildkröte NICHT zurück zum Ausgansgspunkt geht (wie beim Baum oben). | ||
| + | # Bei allen " | ||
| + | # der Turtle bis zu ihrem Endpunkt genau a Pixel betragen. | ||
| + | print(' | ||
| + | |||
| + | def schneeflocke(level, | ||
| + | # Verwende die Funktion " | ||
| + | print(' | ||
| + | |||
| + | speed(0) | ||
| + | # hideturtle() | ||
| + | penup() | ||
| + | backward(SEITENLAENGE/ | ||
| + | pendown() | ||
| + | linienzug(LEVEL, | ||
| + | # left(60) | ||
| + | # schneeflocke(LEVEL, | ||
| + | exitonclick() | ||
| + | </ | ||
| + | |||
| + | Mit dieser Vorarbeit ist es nun einfach, eine Funktion zu definieren, die die sogenannte Kochsche Schneeflocke zeichnet: | ||
| + | |||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | ===== Aufgabe: Animation der obigen Objekte - " | ||
| + | |||
| + | <WRAP center round todo> | ||
| + | Animiere die Objekte, die wir oben gezeichnet haben: | ||
| + | * Zeichne nacheinander den Baum für verschiedene Verzweigungswinkel, | ||
| + | * Lass die Kochsche Schneeflocke rotieren. | ||
| + | |||
| + | Verstehe dazu eines der unten angegebenen Animations-Beispielprogamme ein bisschen und verändere es, indem du an geeigneter Stelle die Funktion zum Baum-Zeichnen bzw. zum Schneeflocke-Zeichnen aufrufst. | ||
| + | |||
| + | Die wichtigen Befehle in diesen Programmen sind '' | ||
| + | |||
| + | <hidden Animations-Beispielprogramm (einfache Variante)> | ||
| + | <code python animierter-kreis.py> | ||
| + | from turtle import * | ||
| + | from time import * | ||
| + | |||
| + | def abbruch(x=0, | ||
| + | global aktiv | ||
| + | aktiv = False | ||
| + | |||
| + | leinwand = Screen() | ||
| + | tracer(n=0) | ||
| + | hideturtle() | ||
| + | |||
| + | for radius in range(-200, 201): | ||
| + | clear() | ||
| + | circle(radius) | ||
| + | update() | ||
| + | sleep(0.01) | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <hidden Animations-Beispielprogramm (kompliziertere Variante, Animation läuft bis zum Abbruch per Mausklick oder Tastendruck)> | ||
| + | <code python animierter-kreis-abbruch-per-click-oder-tastendruck.py> | ||
| + | from turtle import * | ||
| + | from time import * | ||
| + | |||
| + | def abbruch(x=0, | ||
| + | global aktiv | ||
| + | aktiv = False | ||
| + | |||
| + | leinwand = Screen() | ||
| + | tracer(n=0) | ||
| + | hideturtle() | ||
| + | leinwand.onkeypress(abbruch) | ||
| + | leinwand.onclick(abbruch) | ||
| + | listen() | ||
| + | |||
| + | aktiv = True | ||
| + | radius = 20 | ||
| + | veraenderung = 1 | ||
| + | while aktiv: | ||
| + | clear() | ||
| + | circle(radius) | ||
| + | update() | ||
| + | if radius < -200 or radius > 200: | ||
| + | veraenderung = -veraenderung | ||
| + | radius = radius + veraenderung | ||
| + | sleep(0.01) | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | {{: | ||
| + | {{: | ||
| + | |||
| + | </ | ||
| + | |||
| + | Vielleicht ganz nett, falls jemand Spass am Python-Programmieren bekommen hat: [[https:// | ||
| + | ====== Baum-Programm aus Lektion ====== | ||
| + | |||
| + | <code python baum.py> | ||
| + | from turtle import * | ||
| + | |||
| + | STAMMLAENGE = 380 | ||
| + | |||
| + | def ast0(a): | ||
| + | forward(a) | ||
| + | backward(a) | ||
| + | |||
| + | def ast1(a, winkel): | ||
| + | forward(a) | ||
| + | |||
| + | left(winkel) | ||
| + | ast0(a/2) | ||
| + | right(winkel) | ||
| + | ast0(a/2) | ||
| + | right(winkel) | ||
| + | ast0(a/2) | ||
| + | left(winkel) | ||
| + | |||
| + | backward(a) | ||
| + | |||
| + | def ast2(a, winkel): | ||
| + | forward(a) | ||
| + | |||
| + | left(winkel) | ||
| + | ast1(a/2, winkel) | ||
| + | right(winkel) | ||
| + | ast1(a/2, winkel) | ||
| + | right(winkel) | ||
| + | ast1(a/2, winkel) | ||
| + | left(winkel) | ||
| + | |||
| + | backward(a) | ||
| + | |||
| + | def ast(level, a, winkel): | ||
| + | if level == 0: | ||
| + | forward(a) | ||
| + | backward(a) | ||
| + | else: | ||
| + | forward(a) | ||
| + | |||
| + | left(winkel) | ||
| + | ast(level - 1, a/2, winkel) | ||
| + | right(winkel) | ||
| + | ast(level - 1, a/2, winkel) | ||
| + | right(winkel) | ||
| + | ast(level - 1, a/2, winkel) | ||
| + | left(winkel) | ||
| + | |||
| + | backward(a) | ||
| + | |||
| + | speed(0) | ||
| + | # hideturtle() | ||
| + | penup() | ||
| + | left(90) | ||
| + | backward(STAMMLAENGE) | ||
| + | pendown() | ||
| + | ast(6, STAMMLAENGE, | ||
| + | |||
| + | exitonclick() | ||
| + | |||
| + | # Um die Zeichung schneller erscheinen zu lassen, | ||
| + | # gibt es den folgenden Trick: | ||
| + | # Ersetze die Zeile '' | ||
| + | # und ergänze in der Zeile vor '' | ||
| + | # also nach allen Zeichenbefehlen, | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Link zur Kursseite ===== | ||
| + | |||
| + | [[lehrkraefte: | ||
| + | |||