Norecur
to norecur :size
forward / :size 3
right 90
forward / :size 3
left 135
forward / * * :size cos 45 2 3
right 90
forward / * * :size cos 45 2 3
left 135
forward / :size 3
right 90
forward / :size 3
end
to norecur2 :size
norecur / :size 3
right 90
norecur / :size 3
left 135
norecur / * * :size cos 45 2 3
right 90
norecur / * * :size cos 45 2 3
left 135
norecur / :size 3
right 90
norecur / :size 3
end
to norecur3 :size
norecur2 / :size 3
right 90
norecur2 / :size 3
left 135
norecur2 / * * :size cos 45 2 3
right 90
norecur2 / * * :size cos 45 2 3
left 135
norecur2 / :size 3
right 90
norecur2 / :size 3
end
to norecur4 :size
norecur3 / :size 3
right 90
norecur3 / :size 3
left 135
norecur3 / * * :size cos 45 2 3
right 90
norecur3 / * * :size cos 45 2 3
left 135
norecur3 / :size 3
right 90
norecur3 / :size 3
end
to norecur5 :size
norecur4 / :size 3
right 90
norecur4 / :size 3
left 135
norecur4 / * * :size cos 45 2 3
right 90
norecur4 / * * :size cos 45 2 3
left 135
norecur4 / :size 3
right 90
norecur4 / :size 3
end
norecur 100 から norecur5 100
再帰手続きを説明する前に、非再帰の方法で描く自己相似図形です。
実際に線分を描いているのは、norecurだけですね。norecur2〜norecur5までは、同じ定義を積み重ねているだけです。
更に、定義を積み重ねていく事も出来ますが、描画時間が掛かりすぎるのでやりません。:-)
しかし、この自己相似図形と言う物は、面白いですね。
どこの線分を取っても、自分の分身です。金太郎飴状態ですね。
Recur
to recur :depth :size
if :depth > 0 [
recur - :depth 1 (/ :size 3)
right 90
recur - :depth 1 (/ :size 3)
left 135
recur - :depth 1 (/ * * :size cos 45 2 3)
right 90
recur - :depth 1 (/ * * :size cos 45 2 3)
left 135
recur - :depth 1 (/ :size 3)
right 90
recur - :depth 1 (/ :size 3)
] [
forward :size]
end
norecurは、非再帰でしたが、今度は再帰手続にしてみたのが、このプログラムです。
適当に引数を指定して実行して下さい。recur 5
100で、norecur5 100と同じ図形が描けます。
自分自身を呼びだし、depthが0になったら線分を引いています。そして自分自身に戻って行きます。なんとも奇妙な感じですね。
しかし、考え方はnorecurと一緒ですのでソースリストを見較べれば判るでしょう。
この方法だと、幾らでも再帰レベルを深く出来るので、depthを20でも100でも指定できます。
#よほど暇でないかぎりは、しない方が無難でしょうけど。
RecurTest
to recurTest :l :size
local "t
make "t (* :size 1.3333)
repeat - :l 1 [make "t (* :t 1.3333)]
make "t (/ :t 2)
penup
home
right 90
forward :t
right 90
forward / :t 1.72
right 90
pendown
repeat 3 [recur :l :size right 120]
end
recurTest 5 60
recurを、角度を変えながら3回呼び出して描かれた図形です。
位置決めは、ウィンドウの真ん中あたりに来る様に、、、、まあテキトーです。:-D
なんだか痛々しいテトラポットの様な物が描けてしまいました。
|