Scheme Turtle 2

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
==Beispiele mit Rekursion==

Die folgenden Prozeduren für Turtles sind typische Lehrbeispiele für Rekursion. Nebenher werden weitere eingebaute Sprachelemente der Scheme-Turtle-Geometrie eingeführt.

===Klassischer Binärbaum mit jeweils halbierter Astlänge===
Die jeweils ansetzenden Teilbäume haben gerade die halbe Stammlänge gegenüber ihren Vorgängern. Die Stämme benachbarter Binärbäume bilden einen Winkel von 90 Grad. Wenn eine Stammlänge von 20 Einheiten unterschritten wird, endet die Baum-Verzweigung.
<eval>
(clear canvas)
(move turtle 200 200)

(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 turtle)
</eval>
<canvas></canvas>


<eval>
(clear canvas)
(move turtle 200 200)

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

(tree 100 turtle)
</eval>
<canvas></canvas>





<eval>
(clear canvas)
(move turtle 200 200)

(define tree
 (lambda(side winkel) 
  (cond [(< side 4) #t] 
        [else  
          (penwidth turtle (+ (/ side 10) 1 ))    
          (forward turtle side)  
          (left turtle winkel)  
          (tree (/ side 2) winkel)  
          (left turtle winkel)  
          (tree (/ side 2) winkel)  
          (right turtle (* 4 winkel))  
          (tree (/ side 2) winkel)  
          (left turtle winkel)  
          (tree (/ side 2) winkel)  
          (left turtle winkel)  
          (backward turtle side)])))

(tree 100 25)
</eval>

<canvas></canvas>

Die folgende Prozedure <tt>tree</tt> verwendet einen Parameter für die ''turtle''.



Zur Erforschung echter Rekursion verwenden wir die Prozedur <tt>random-walk</tt>. 

<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>
<eval>
(define random
  (random-maker 19768116))  ;; Anfangswert verändern!

(clear canvas4)
(move turtle4 200 310)
(pencolor turtle4 0 0 200)

(define random-walk
  (lambda (angle length n turtle)
    (if (= n 0)
        ;(penerase turtle)
        (pencolor turtle4 220 0 0)
        (begin          
          (forward turtle length)
          (right turtle angle)
          (random-walk (+ 5 (random angle))(+ 5 (random length)) (- n 1) turtle)
          ;(sleep-for-a-while 0.01)
          (left turtle angle)
          (backward turtle length)))))

(random-walk 360 20 1000 turtle4)
</eval>
<canvas h=500></canvas>

(define t (clone turtle)) 
(hide t)
(forward t 50)
(right t 90)
(forward t 50)
(show t)
(setangleto t turtle)