読書会メモ
今日は頁てきには 1 頁でしたが、結構濃かったです。あっという間の 1.5h
今日はなんとなくですが、もくもくとコードをニラんだカンジでした。
問題 2.63
'(3 '(1 '() '()) '(5 '() '())) ;; 3 ;; / \ ;; 1 5
なリストを tree->list に吸わせると
(1 3 5)
が戻る。tree->list1 なら
(append (append '() (cons 1 '())) (cons 3 (append '() (cons 5 '()))))
tree->list2 なら
(cons 1 (cons 3 (cons 5 '())))
という事で性能てきには append の数分違う、という結論。cons の回数自体は同じはずなんだけど、tree->list1 は cons と同じ回数 append している。
問題 2.64
let がひたすらに重なっておられます。
'(1 3 5 7 9 11)
が何を作るか。なんとなく
'(5 (1 () (2 () ())) (9 (7 () ()) (11 () ()))) ;; 5 ;; / \ ;; 1 9 ;; \ / \ ;; 2 7 11
ではないかと。以下にざっくり要件を纏めておきます。
まず、基本的には以下のような部分木の集合
n が 1 の場合 ;; 1 ;; / \ ;; () () n が 2 の場合 ;; 1 ;; / \ ;; () 2 ;; / \ ;; () () n が 3 の場合 ;; 2 ;; / \ ;; 1 3 ;; / \ / \ ;; () () () ()
の集りである、という事。上記にあるように n が 1 以外の偶数の場合は右の部分木の要素の数の方が多くなる模様。また、上記の通り、n が 1 以外の場合、
- 奇数だったら (+ (/ (- n 1) 2) 1) が中央の要素
- 偶数だったら (/ n 2) が中央の要素
ちなみに C な配列と違って要素番号は 1 から始まります。
それにしても
最小構成な構造の集合、というあたりに面白さがあります。例えば n が 4 の場合には
;; 2 ;; / \ ;; 1 3 ;; / \ / \ ;; () () () 4 ;; / \ ;; () ()
になる。左の部分木は n が 1 で、右の部分木は n が 2 になっている。n が 5 になると
;; ;; 3 ;; / \ ;; 1 4 ;; \ \ ;; 2 5
という形になるのか。n が 6 になると
;; ;; 3 ;; / \ ;; 1 5 ;; \ / \ ;; 2 4 6
という形、という事でルールが分かってれば類推は簡単になりますな。
今後は
パートナーが希望のあたりをごりごりヤッちゃう、という方向が良さげ。わしが適切な助言ができているか、という問題があるんですが。。