関数型言語の勉強にSICPを読もう - (11) 2章 - データによる抽象の構築(62-63ページ)

問題 2.24

(list 1 (list 2 (list 3 4)))
gosh> (1 (2 (3 4)))

問題なし。

問題 2.25

(car (cdr (car (cdr (cdr (list 1 3 (list 5 7) 9))))))

(car (car (list (list 7))))

(car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7))))))))))))))))))

しかし練習問題の難易度にものすごいばらつきを感じる。
そしてこの解答はどうなのよ。

問題 2.26

(append x y)
gosh> (1 2 3 4 5 6)

(cons x y)
gosh> ((1 2 3) 4 5 6)

(list x y)
gosh> ((1 2 3) (4 5 6))

(list x y)を間違えた。答えを見て納得。

問題 2.27

まずは reverse 再実装。以前は苦戦したけど早く書けるようになった。
でもきれいかどうかと言われると微妙。
識者の意見が欲しいところ。

(define (reverse l)
  (if (null? l)
      '()
      (append (reverse (cdr l)) (list (car l)))))

これを手がかりに deep-reverse を実装。pair? を使うのがポイント。

(define (deep-reverse l)
  (if (null? l)
      '()
      (append (deep-reverse (cdr l)) (if (pair? (car l)) (list (deep-reverse (car l))) (list (car l))))))

(deep-reverse (list 1 2 3 4))
(deep-reverse (list (list 1 2 3) (list 5 6)))

解答例によると reverse を使うと。ガーン!。
しかもそこで map か!こんなの思いつかないよ(涙)

(define (deep-reverse tree)
  (if (not (pair? tree))
      tree
      (reverse (map deep-reverse tree))))


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404