SICP 問題 2.31(square-tree を抽象化して、map の tree バージョンを作る)

【問題】

問題 2.30 の答えを抽象化し、square-tree が


(define (square-tree tree) (tree-map square tree))
と定義できるように、手続き tree-map を作れ。

【解答】

まぁ、当然抽象化の方向に行くよね。

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

;2乗を求める手続き
(define (square x)
  (* x x))

;受け取った要素を判別して適切な処理を行う。
(define (tree-map proc tree)
  (let loop ((src tree)
	     (dst '()))
    (cond ((null? src)
	   (reverse dst))
	  ((list? (car src))
	   (loop (cdr src) (cons (tree-map proc (car src)) dst)))
	  (else
	   (loop (cdr src) (cons (proc (car src)) dst))))))

では実験。


gosh> (square-tree '(1 (2 (3 4) 5) (6 7)))
(1 (4 (9 16) 25) (36 49))
gosh> (tree-map (lambda (x) (* x 2)) '(1 (2 (3 4) 5) (6 7)))
(2 (4 (6 8) 10) (12 14))
gosh> (tree-map (lambda (x) (expt x 3)) '(1 (2 (3 4) 5) (6 7)))
(1 (8 (27 64) 125) (216 343))
gosh>
おっけ〜。