問題2-30〜31

木の写像に関する問題です。treeの全ての要素に何らかの処理を加える手法を模索していきます。
まず問題2-30ですが、例題手続きを応用して、全ての要素を二乗するための手続きを書きます。

(define sample-tree (list 1 (list 2 (list 3 4) 5) (list 6 7)))
(define (square x) (* x x))

(define (square-tree-recr tree)
  (cond ((null? tree) '())
        ((not (pair? tree)) (square tree))
        (else (cons (square-tree-recr (car tree))
                    (square-tree-recr (cdr tree))))))

(square-tree-recr sample-tree)


=>(1 (4 (9 16) 25) (36 49))

(define (square-tree-map tree)
  (map (lambda (sub-tree)
         (if (pair? sub-tree)
             (square-tree-map sub-tree)
             (square sub-tree)))
       tree))

=>(1 (4 (9 16) 25) (36 49))

次に、上記手続きを抽象化したtree-mapを作ってみます(問題2-31)。

(define (tree-map proc tree)
  (map (lambda (sub-tree)
         (if (pair? sub-tree)
             (tree-map proc sub-tree)
             (proc sub-tree)))
       tree))

(define (square-tree-abstruct tree)
  (tree-map square tree))

(square-tree-abstruct sample-tree)

=>(1 (4 (9 16) 25) (36 49))

問題2-32は手強そうなので、時間をかけて考えてみたいと思います。