2.2.1 並びの表現
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-15.html#%_sec_2.2.1
ようやく、リストが出てくる。リストは、ポインタであり、最後のデータのcdrには、nullポインタがセットされている。
リストの操作には主に3つある。
- リストを順に"cdrダウン"する
- リスト全体を"cdrダウン"する
- リストをcdrダウンしつつ、"consアップ"する
正直、この3つの違いがよくわからない。おそらく、普段意識することが無いからだろうな。
問題2.17
(define (last-pair items) (if (null? (cdr items)) items (last-pair (cdr items)))
問題2.18
再帰プロセスで書こうとして、結局断念した。再帰プロセスで書くのは無理なのかな?
(define (myreverse items) (define (iter a b) (if (null? b) a (iter (cons (car b) a) (cdr b)))) (iter '() items))
追記(09.11.05) SICP Lite#6で再帰版を考えたらあっさりできた。
(define (myreverse items) (if (null? items) '() (append (myreverse (cdr items)) (list (car items)))))
問題2.19
(define (first-denomination items) (car items)) (define (except-first-denomination items) (cdr items)) (define (no-more? items) (null? items))
問題2.20
すみません。答え見てまいました。
(define (same-parity x . y) (define pred (if (even? x) even? odd?)) (define (filter p xs) (cond ((null? xs) '()) ((pred (car xs)) (cons (car xs) (filter p (cdr xs)))) (else (filter p (cdr xs))))) (cons x (filter pred y)))
問題2.21
- 通常のリスト操作版
(define (square-list1 items) (if (null? items) '() (cons (square (car items)) (square-list1 (cdr items)))))
- map版
(define (square-list2 items) (map square items))
問題2.22
Iterativeにすると、リストが逆順になる。これは、最初に作ったconsセルを包み込むように次のconsセルが作られてしまうため。
問題2.23
反則だと思うけど、begin式を使った。
(define (my-foreach proc items) (if (not (null? items)) (begin (proc (car items)) (my-foreach proc (cdr items)))))