問題解答
問2.20
(define (same-party x . y)
(define (iter f l)
(cond ((null? l) ())
((= (mod (car l) 2) f) (cons (car l) (iter f (cdr l))))
(else (iter f (cdr l)))))
(iter (mod x 2) y))
(same-party 1 2 3 4 5 6 7)
(same-party 2 2 3 4 5 6 7)
終了条件をどうすればいいのかわからなくて、ちょっと考えてしまいました。
これくらいのプログラムを書くにも未だに慣れないです。
本文
リストの写像
map を使用して、より抽象化することができる
(define (map proc items)
(if (null? items)
()
(cons (proc (car items))
(map proc (cdr items)))))
(map (lambda(x) (* x x))
(list 1 2 3 4))
問題解答
問2.21
(define (square-list items)
(if (null? items)
()
(cons (* (car items) (car items))
(square-list (cdr items)))))
(define (square-list items)
(map (lambda(x) (* x x)) items))
(square-list (list 1 2 3 4))
問2.22
最初のコードは頭から値を取り出して、リストの頭に値を挿入しているので逆になってしまう。
変更したコードは、answer が対なので、対と値の対を作ってしまう。そのため、((() 1) 4 9) のような結果になってしまう。
問2.23
(define (for-each f items)
(if (null? items)
true
(f (car items)) (for-each f (cdr items))))
(for-each (lambda (x) (newline) (display x))
(list 57 321 88))
これはこれで正解ですが、解答例を見ると begin というものがあるのですね。
本日はここまで。