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 脳が退化しており (以下略

続きは別途、とゆー事で。(弱