练习 2.30 的两个 square-tree
都共享同一种抽象模式,我们可以将这种模式单独抽取出来,称之为 tree-map
。
和 square-tree
类似, tree-map
也可以用两种不同的方式来定义。
;;; 31-tree-map-using-cond.scm
(define (tree-map f tree)
(cond ((null? tree) ; 空树
'())
((not (pair? tree)) ; 叶子节点
(f tree))
(else
(cons (tree-map f (car tree)) ; 递归处理左右子树
(tree-map f (cdr tree))))))
测试:
1 ]=> (tree-map square (list (list 1 2) (list 3 4)))
;Value 11: ((1 4) (9 16))
;;; 31-tree-map-using-map.scm
(define (tree-map f tree)
(map (lambda (sub-tree)
(if (pair? sub-tree)
(tree-map f sub-tree) ; 处理子树
(f sub-tree))) ; 处理节点
tree))
测试:
1 ]=> (tree-map square (list (list 1 2) (list 3 4)))
;Value 11: ((1 4) (9 16))