問題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は手強そうなので、時間をかけて考えてみたいと思います。