SICP 読み (101) 3.3.1 可変リスト構造
マンガな問題微妙です。画像がいくらでもアプできれば、なんですがそれ以前に描画自体が微妙だったり (を
しかも 3.2.4 節な問題 3.11 スルーだし。
問題 3.12
とりあえず応答のみを以下に。
gosh> (define x (list 'a 'b)) x gosh> (define y (list 'c 'c)) y gosh> (define z (append x y)) z gosh> z (a b c d) gosh> (cdr x) (b) gosh> (define w (append! x y)) w gosh> (cdr x) (b c d) gosh>
問題 3.13
循環リストができて、(last-pair z) したらループ。
問題 3.14
以下なカンジ。
gosh> (define v (list 'a 'b 'c 'd)) v gosh> v (a b c d) gosh> (define w (mystery v)) w gosh> w (d c b a) gosh> v (a) gosh>
リストは逆順になるんですが、v は a なセルを指したまま。
問題 3.15
マンガのみ、なのでスルーします。
問題 3.16
これもマンガ問題なんですが、gosh にて該当するリストを作ってみます。
gosh> (define (count-pairs x) (if (not (pair? x)) 0 (+ (count-pairs (car x)) (count-pairs (cdr x)) 1))) count-pairs gosh> (define l1 (list 'a 'b 'c)) l1 gosh> (count-pairs l1) 3 gosh> (define l21 (list 'a)) l21 gosh> (define l22 (cons l21 l21)) l22 gosh> (define l2 (cons 'b l22)) l2 gosh> (count-pairs l2) 4 gosh> (define l31 (list 'a)) l31 gosh> (define l32 (cons l31 l31)) l32 gosh> (define l3 (cons l32 l32)) l3 gosh> (count-pairs l3) 7 gosh> (define l41 (list 'a)) l41 gosh> (define l42 (list 'b)) l42 gosh> (define l4 (cons l42 l41)) l4 gosh> (set-cdr! l42 l4) #<undef> gosh> l4 #0=((b. #0#) a) gosh> (count-pairs l4)
問題 3.17
これはまだ検討中。問題にある_補助のデータ構造_を作りつつ、eq? が #f な要素を追加していって、その length を調べれば良い、と。備忘録まで一番マトモなリストを例として以下に手順を。(嘘かも
gosh> (define a (list 'a 'b 'c)) a gosh> (define b (cons a '())) b gosh> b ((a b c)) gosh> (set-cdr! b (cons (cdr a) '())) #<undef> gosh> (set-cdr! (cdr b) (cons (cdr (cdr a)) '())) #<undef> gosh> (length b) 3 gosh> (eq? (car b) a) #t gosh> (eq? (cadr b) (cdr a)) #t gosh> (eq? (caddr b) (cddr a)) #t gosh>
- car 又は cdr が pair? なら検査用のリストに追加。(上記の例では car が pair? を満たすソレは入っていません)
- 検査用のリストに追加する方法としては set-cdr! を使う
- 追加する前に検査用のリストに eq? な要素が無い事を確認 (上記ではしてない
でなんとかなりそうなんですが scheme 脳が退化しており (以下略
続きは別途、とゆー事で。(弱