Define a procedure square-tree analogous to the square-list procedure of exercise 2.21. That is, square-list should behave as follows:
(square-tree (list 1 (list 2 (list 3 4) 5) (list 6 7))) (1 (4 (9 16) 25) (36 49))
Define square-tree both directly (i.e., without using any higher-order procedures) and also by using map and recursion.
I wrote this solution. What do you think?
(define (square x) (* x x))
(define (square-tree tree)
(cond ((null? tree) null)
((pair? tree)
(cons (square-tree (car tree))
(square-tree (cdr tree))))
(else (square tree))))
(define (map-square-tree tree)
(map (lambda (subtree)
(if (pair? subtree)
(cons (square-tree (car subtree))
(square-tree (cdr subtree)))
(square subtree)))
tree))
(define a (list 1 1 (list (list 2 3) 1 2)))
EDIT: This is a much better solution for map-square-tree.
(define (square x) (* x x))
(define (square-tree tree)
(cond ((null? tree) null)
((pair? tree)
(cons (square-tree (car tree))
(square-tree (cdr tree))))
(else (square tree))))
(define (map-square-tree tree)
(map (lambda (subtree)
((if (pair? subtree) map-square-tree square) subtree))
tree))
(define a (list 1 1 (list (list 2 3) 1 2)))