SICP 問題 2.44(up-splitを定義)
問題
corner-split で使った手続き up-split を定義せよ。below と beside の働き切り替える他は right-split と同様である。
解答
corner-split と right-split は直前に記載されているのでここに掲載しておこう。
(define (corner-split painter n) (if (= n 0) painter (let ((up (up-split painter (- n 1))) (right (right-split painter (- n 1)))) (let ((top-left (beside up up)) (bottom-right (below right right)) (corner (corner-split painter (- n 1)))) (beside (below painter top-left) (below bottom-right corner)))))) (define (right-split painter n) (if (= n 0) painter (let ((smaller (right-split painter (- n 1)))) (beside painter (below smaller smaller)))))
で、up-split は right-split を参考にすればいいんだからこんな感じ。
あ、below は第1引数が下側、第2引数が上側になるので気をつけよう。これは corner-split を見れば分かる感じ。
(※SICPに記載されている、corner-split 以外の他の below の使い方をみてもわからんかった。)
(define (up-split painter n) (if (= n 0) painter ;再帰呼び出しは自分を呼び出すように修正 (let ((smaller (up-split painter (- n 1)))) ;まず上下に分けて、更に上側を横方向に分けて smaller を呼び出す。 (below painter (beside smaller smaller)))))
確認の仕方がわからねぇな。そのうち painter を作るだろうからそんときに確認すっか。