Rekursive Prozeduren 1

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
[[Programmierparadigmen_-_Computerübungen|Zurück zu den Übungen]]

Heute beschäftigen wir uns mit einen Turtle ist eine Zeichenroboter die man sich vorstellen kann wie eine Schildkröte mit stift am Bauch
Der Turtle lebt auf einer Zeichenfläche (<tt>canvas</tt>).

In den folgenden Beispielen werden Sie auf verschiedenen <tt>canvas</tt> mit verschiedenen <tt>Turtles</tt> arbeiten.
um diese anzusprechen hat jede fläche und jeder Turtle einen eigenen Namen welcher immer vorher angegeben wird. In der regel wird die erste Zeichenfläche <tt>canvas1</tt> mit <tt>turtle1</tt> auf <tt>canvas2</tt> <tt>turtle2</tt> und so weiter 

Sämtliche Kommandos, die eine Turtle versteht, finden sich in der folgenden Liste. Das
Aufrufmuster ist:
([comando] [turtle] [parameter])

===Befehlsliste===

{| border='1px'
|+ Turtle Befehle
! Befehl !! Beschreibung
|-
| home
| setzt den Turtle auf die Mitte der Zeichenfläche
|-
| move turtle x y
| setzt den Turtle die x und y Koordinate der Zeichenfläche
|-
| forward turtle x
| lässt den Turtle x Schritte nach vorn gehen
|-
| backward turtle x
| lässt den Turtle x schritte nach hinten gehen
|-
| pendown turtle
| setzt den stift ab und lässt den turtle zeichnen (standart)
|-
| penup turtle
| nimmt den stift hoch und der turtle hört auf zu zeichnen
|-
| penwidth turtle x
| Setzt die Stärke des Stiftes auf x
|-
| pencolor turtle r g b
| Setzt die Farbe des Stiftes auf Rot Gelb Grün (Werte der Farben im bereich 0 - 255)
|-
| right turlte x
| Dreht den Turtle um x Grad nach Rechts
|-
| left turtle x
| Dreht den Turtle um x Grad nach Links
|-
| hide turtle
| Blendet den Turtle aus
|-
| show turtle
| Blendet den Turtle ein
|-
| clone turtle
| Clont den Turtle in der Aktuellen Position
|-
| panerase turtle
| Der Turtle löscht Linien über die er Fährt (wie ein Radiergummi)
|-
| clear canvas
| Löscht die Zeichenfläche
|-
|}



===Beispiel===
Setzen sie sich mit der folgenden Beispiel auseinander und testen sie eigenen Funktionen mit dem Turtle
{|width="100%"
|-valign="top"
|width=600|<canvas width=600 height=300></canvas>||<eval>
(clear canvas1)
(home turtle1)

(define quad
  (lambda (turtle s)
    (begin  
      (penwidth turtle 10)
      (pencolor turtle 255 0 0)
      (forward turtle s)
      (right turtle 90)
      (forward turtle s)
      (right turtle 90)
      (forward turtle s)
      (right turtle 90)
      (forward turtle s)
      (right turtle 90))))
 
(quad turtle1 50)
</eval>
|}

===Rechteck===
1. Schreiben Sie eine Prozedur, die ein Rechteck mit den Seitenlänngen a und b mit einer der <tt>turtle2</tt> auf <tt>canvas2</tt> zeichnet.
<eval>;Rechteck canvas2 turtle2</eval>


===Nikolaus===
Schreiben Sie auf <tt>canvas2</tt> eine Prozedur, mit deren Hilfe das Haus vom Nikolaus gezeichnet werden kann. Diese soll als Argumente die Turtle sowie die Länge der Grundseite des Hauses ubernehmen.
<eval>;Nikolaus canvas2 turtle2</eval>

===Kreisbogen===

Schreiben Sie eine rekursive Prozedur kreisbogen, die die Turtle Nummer 5, die Bogenlänge und den 
Drehwinkel der Turtle nach jedem Schritt (der Länge 1) nimmt und einen dementsprechenden Kreisbogen zeichnet.
Hinweis: Ein Turtle-Kreis ist ein 360-Eck. Jeder der 360 Turtle-Schritte hat die
Länge 1. Nach jedem Schritt dreht sich die Turtle um 1 Grad nach rechts (oder
links). Der Umfang dieses Kreises beträgt offenbar 360. (Ganz nebenbei: Wie groß ist dann eigentlich der Radius?)
<eval cols=150>;kreisbogen canvas2 turtle2</eval>

'''<tt>canvas2</tt>'''

<canvas width=700 height=400></canvas>

===Tree===
Erproben Sie die folgende rekursive Prozedur <tt>tree</tt> unter Verwendung des turtle-
Systems.

{|width="100%"
|-valign="top"
|width=600|<canvas width=600 height=300></canvas>||
<eval>
;tree canvas3 turtle3
(clear canvas3)
(move turtle3 300 230)

(define tree
 (lambda(side turtle) 
  (cond 
    ((< side 20) #t)
    (else  
      (penwidth turtle (+ (/ side 10) 1 ))    
      (forward turtle side)  
      (left turtle 45)  
      (tree (/ side 2) turtle) 
      (right turtle 90)  
      (tree (/ side 2) turtle)
      (left turtle 45)  
      (backward turtle side)))))

(tree 100 turtle3)
</eval>
|}

===Random Walk===
<code hidden>
(define random-maker
  (let* ((multiplier 48271)
         (modulus 2147483647)
         (apply-congruence
          (lambda (current-seed)
            (let ((candidate (modulo (* current-seed multiplier)
                                     modulus)))
              (if (zero? candidate)
                  modulus
                  candidate))))
         (coerce
          (lambda (proposed-seed)
            (if (integer? proposed-seed)
                (- modulus (modulo proposed-seed modulus))
                19860617))))  ;; an arbitrarily chosen birthday
  (lambda (initial-seed)
    (let ((seed (coerce initial-seed)))
      (lambda args
        (cond ((null? args)
               (set! seed (apply-congruence seed))
               (/ (- modulus seed) modulus))
              ((null? (cdr args))
               (let* ((proposed-top
                       (ceiling (abs (car args))))
                      (exact-top
                       (if (inexact? proposed-top)
                           (inexact->exact proposed-top)
                           proposed-top))
                      (top
                       (if (zero? exact-top)
                           1
                           exact-top)))
                 (set! seed (apply-congruence seed))
                 (inexact->exact (floor (* top (/ seed modulus))))))
              ((eq? (cadr args) 'reset)
               (set! seed (coerce (car args))))
              (else
               (display "random: unrecognized message")
               (newline))))))))
</code>
Erarbeiten Sie eine rekursive Prozedur randomwalk, die eine turtle und eine Schrittanzahl erwartet und die turtle bei jedem Schritt zufällig 0 bis 16 grad nach rechts dreht und 0 bis 10 Pixel vorwärts bewegt.
Erstellen sie vorher einen Zufallszahlengenerator mit 
 (define random 
 (random-maker <init>))
Danach bekommt man mit <tt>(random <zahl>)</tt> eine neue Zufalszahl
                          
{|width="100%" 
|-valign="top"
|width=600|<canvas width=600 height=300></canvas>||<eval>;randomwalk canvas4 turtle4</eval>
|}

===Rosette===


[[Bild:Rosette.jpeg|thumb|Rosette|200px]]

Lassen Sie sich von der schönen Rosette (s.u.) inspirieren und entwerfen Sie ähnliche. Beginnen Sie stets mit der Planung und verbalen Beschreibung der zu zeichnenden Figuren. Die Implementation erfolgt mit rekursiven Turtle-Prozeduren.



{| width="100%"
|-valign="top"
|width=600|<canvas width=600 height=300></canvas> ||<eval>;Rosette canvas5 turtle5</eval>
|}

[[Programmierparadigmen_-_Computerübungen|Zurück zu den Übungen]]