問題 2.31

(define (square x) (* x x))
(define (square-tree tree) (tree-map square tree))

;高階手続き無しの形。
(define (tree-map f tree)
  (cond ((null? tree) null)
        ((not (pair? tree)) (f tree))
        (else (cons (tree-map f (car tree))
                    (tree-map f (cdr tree))))))

(square-tree (list 1 (list 2 (list 3 4) 5) (list 6 7)))
;-> (1 (4 (9 16) 25) (36 49))

;map再帰の形。
(define (tree-map f tree)
  (map (lambda (item)
         (if (pair? item)
             (tree-map f item)
             (f item))) tree))

(square-tree (list 1 (list 2 (list 3 4) 5) (list 6 7)))
;-> (1 (4 (9 16) 25) (36 49))