Scheme Turtle 5
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
===Random-Walk===
Diese Prozedur verdeutlicht den rekursiven Abstieg/Aufstieg, wie er bei echter Rekursion stattfindet, grafisch.
Jeder rekursiver Aufruf erzeugt eine Strecke, deren Richtung und Länge zufällig gewählt sind. Nach ''n'' <nowiki>n</nowiki>Strecken dieser Art kehrt die Turtle zurück, indem alle Strecken (nach dem Stapelprinzip) rückwärts zurückgelegt werden. Vorher wird der Stift mittels <tt>penerase</tt> zum Radiergummi gemacht, sodass die gezeichnete Linie gelöscht wird. Alternativ kann eine andere Zeichenfarbe gewählt werden.
<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 19716)) ;; Anfangswert verändern!
(clear canvas)
(move turtle 200 310)
(pencolor turtle 0 0 200)
(define random-walk
(lambda (angle length n turtle)
(if (= n 0)
(penerase turtle)
;(pencolor turtle 220 0 0)
(begin
(forward turtle length)
(right turtle angle)
(random-walk (+ 5 (random angle))(+ 5 (random length)) (- n 1) turtle)
(left turtle angle)
(backward turtle length)))))
(random-walk 360 20 100 turtle)
</eval>
<canvas h=500></canvas>
<code hidden>
;(define t (clone turtle))
;(hide t)
;(forward t 50)
;(right t 90)
;(forward t 50)
;(show t)
;(setangleto t turtle)
</code>