Scheme Turtle 5
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>SchemeJS</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'' 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 id="4b4069a01c3d1" 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>
<run id="4b4069a01d372">
(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)
</run>
<canvas h=500></canvas>
<code id="4b4069a01cba4" hidden>
;(define t (clone turtle))
;(hide t)
;(forward t 50)
;(right t 90)
;(forward t 50)
;(show t)
;(setangleto t turtle)
</code>