lehrkraefte:snr:informatik:glf22:python:rekursion

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:snr:informatik:glf22:python:rekursion [2022/12/21 10:20]
Olaf Schnürer [Einführung am Beispiel]
lehrkraefte:snr:informatik:glf22:python:rekursion [2022/12/23 22:32] (current)
Olaf Schnürer [Einführung am Beispiel]
Line 7: Line 7:
 <WRAP center round todo 100%> <WRAP center round todo 100%>
 Gemeinsames angeleitetes Programmieren: Baumwachstum simulieren, von Jahr zu Jahr. Gemeinsames angeleitetes Programmieren: Baumwachstum simulieren, von Jahr zu Jahr.
 +
 +<hidden Anweisung für Lehrer:>
 +Sukzessive die Funktionen ''ast0'', ''ast1'', ''ast2'', ''ast3'', ... schreiben und mit Skizzen erklären (wie setzt sich die Zeichnung von ''ast3'' aus den anderen "Ästen" zusammen?). Idee, um das Schreiben "unendlich vieler" Funktionen zu vermeiden: Ersetze die Zahl im Funktionsnamen durch einen Parameter (etwa namens ''level'' oder ''jahr'') in einer neuen Funktion ''ast''.
 +Alle Funktionen haben die aktuelle Streckenlänge als Parameter ''a''. Eventuell zusätzlich den Winkel als Parameter übergeben (bei ''ast0'' wird er nicht verwendet). 
 +</hidden>
  
 {{:lehrkraefte:snr:informatik:glf22:python:baum-0.png?200|}} {{:lehrkraefte:snr:informatik:glf22:python:baum-0.png?200|}}
Line 31: Line 36:
  
 exitonclick() exitonclick()
 +
 +# Um die Zeichung schneller erscheinen zu lassen, 
 +# gibt es den folgenden Trick:
 +# Ersetze die Zeile ''speed(0)'' durch ''tracer(0)'' 
 +# und ergänze in der Zeile vor ''exitonclick()'', 
 +# also nach allen Zeichenbefehlen, die Zeile ''update()''.
 </code> </code>
  
-Experimentiere: Für welche Verzweigungswinkel kommt eine besonders schöne Figur heraus?+Experimentiere:  
 +  * Für welche Verzweigungswinkel kommt eine besonders schöne Figur heraus? (Es gibt zwei "besonders schöne Winkel".) 
 +  * 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, den Winkel bei jedem rekursiven Aufruf zu verdoppeln (und die Längen wie üblich zu halbieren). 
 +  * 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> </WRAP>
  
Line 40: Line 57:
  
 **Rekursion** meint in der Informatik (und ähnlich in der Mathematik) den Einsatz rekursiver Funktionen.  **Rekursion** meint in der Informatik (und ähnlich in der Mathematik) den Einsatz rekursiver Funktionen. 
 +
 +Etymologie: lateinisch //recurrere//, zurücklaufen, auf etwas zurückkommen
 </WRAP> </WRAP>
  
Line 46: Line 65:
  
 <WRAP center round todo> <WRAP center round todo>
-Schreibe eine rekursive Funktion, die je nach "Level" die folgenden Bilder zeichnet (wenn man diese Kurve "unendlich genau" zeichnet, bekommt man die sogenannte [[https://de.wikipedia.org/wiki/Koch-Kurve|Koch-Kurve]]):+Schreibe eine rekursive Funktion, die je nach "Level" die folgenden Bilder zeichnet (alle Winkel sind entweder $60^\circ$ oder $120^\circ$; wenn man diese Kurve "unendlich genau" zeichnet, bekommt man die sogenannte [[https://de.wikipedia.org/wiki/Koch-Kurve|Koch-Kurve]]):
  
 {{:lehrkraefte:snr:informatik:glf22:python:kochlinie-0.png?200|}} {{:lehrkraefte:snr:informatik:glf22:python:kochlinie-0.png?200|}}
Line 62: Line 81:
 SEITENLAENGE = 400 SEITENLAENGE = 400
  
-def linienzug(level, a):+def kochkurve(level, a): 
 +    # "kochkurve(0, a)" soll eine Strecke der Länge a zeichnen, wobei 
 +    # die Schildkröte NICHT zurück zum Ausgansgspunkt geht (wie beim Baum oben). 
 +    # Bei allen "höheren Kochkurven" "kochkurve(>0, a)" soll der Abstand vom Startpunkt 
 +    # der Turtle bis zu ihrem Endpunkt genau a Pixel betragen. 
     print('Hier ist die rekursive Funktion "linienzug" zu definieren!')     print('Hier ist die rekursive Funktion "linienzug" zu definieren!')
  
 def schneeflocke(level, a): def schneeflocke(level, a):
 +    # Verwende die Funktion "kochkurve" dreimal, um die Schneeflocke zu zeichnen.
     print('Hier ist die Funktion "schneeflocke" zu definieren!')     print('Hier ist die Funktion "schneeflocke" zu definieren!')
  
Line 88: Line 112:
 <WRAP center round todo> <WRAP center round todo>
 Animiere die Objekte, die wir oben gezeichnet haben: Animiere die Objekte, die wir oben gezeichnet haben:
-  * Zeichne nacheinander den Baum für verschiedene Verzweigungswinkel, etwa bei 30 Grad startend bis 120 Grad und dann wieder retour, jeweils in Schritten von 1 Grad.+  * Zeichne nacheinander den Baum für verschiedene Verzweigungswinkel, etwa bei 30 Grad startend bis 120 Grad in Schritten von 1 Grad.
   * Lass die Kochsche Schneeflocke rotieren.   * Lass die Kochsche Schneeflocke rotieren.
  
-Verstehe dazu das unten angegebene Animations-Beispielprogamm (wachsender und schrumpfender Kreis) ein bisschen und verändere es, indem du an geeigneten Stellen die Funktion zum Baum-Zeichnen bzw. zum Schneeflocke-Zeichnen aufrufst (die ''while''-Schleife wird verlassen, sobald der Benutzer eine Taste drückt oder mit der Maus in das Zeichenfenster klickt).+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.
  
-{{:lehrkraefte:snr:informatik:glf22:python:baum.gif?400|}} +Die wichtigen Befehle in diesen Programmen sind ''tracer(0)'' und ''update()''Sie sorgen dafür, dass alle Zeichnungen "im Hintergrund" entstehen und erst per Update sichtbar werden. So vermeidet man das Flackern des Bildschirms. Ausserdem wird deutlich schneller gezeichnet.
-{{:lehrkraefte:snr:informatik:glf22:python:flocke.gif?400|}}+
  
-<code python kreis-animiert.py>+<hidden Animations-Beispielprogramm (einfache Variante)> 
 +<code python animierter-kreis.py> 
 +from turtle import * 
 +from time import * 
 + 
 +def abbruch(x=0, y=0): 
 +    global aktiv 
 +    aktiv = False 
 + 
 +leinwand = Screen() 
 +tracer(n=0) 
 +hideturtle() 
 + 
 +for radius in range(-200, 201): 
 +    clear() 
 +    circle(radius) 
 +    update() 
 +    sleep(0.01) 
 +</code> 
 +</hidden> 
 + 
 +<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 turtle import *
 from time import * from time import *
Line 123: Line 168:
     sleep(0.01)     sleep(0.01)
 </code> </code>
 +</hidden>
 +
 +{{:lehrkraefte:snr:informatik:glf22:python:baum.gif?400|}}
 +{{:lehrkraefte:snr:informatik:glf22:python:flocke.gif?400|}}
 +
 </WRAP> </WRAP>
  
 Vielleicht ganz nett, falls jemand Spass am Python-Programmieren bekommen hat: [[https://amankharwal.medium.com/130-python-projects-with-source-code-61f498591bb|190 Python projects]] Vielleicht ganz nett, falls jemand Spass am Python-Programmieren bekommen hat: [[https://amankharwal.medium.com/130-python-projects-with-source-code-61f498591bb|190 Python projects]]
 +====== 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)      # alte Funktion ast0
 +        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, 30)
 +
 +exitonclick()
 +
 +# Um die Zeichung schneller erscheinen zu lassen, 
 +# gibt es den folgenden Trick:
 +# Ersetze die Zeile ''speed(0)'' durch ''tracer(0)'' 
 +# und ergänze in der Zeile vor ''exitonclick()'', 
 +# also nach allen Zeichenbefehlen, die Zeile ''update()''.
 +</code>
  
  
  • lehrkraefte/snr/informatik/glf22/python/rekursion.1671614442.txt.gz
  • Last modified: 2022/12/21 10:20
  • by Olaf Schnürer