类似于 练习 2.21 的两种不同的 square-list
定义,我们也可以用两种不同的方式来定义 square-tree
。
首先是使用 cond
判断的方式(这个函数和书本 75 的第一个 scala-tree
定义也很相似):
;;; 30-square-tree-using-cond.scm
(define (square-tree tree)
(cond ((null? tree) ; 空树
'())
((not (pair? tree)) ; 叶子节点
(square tree))
(else
(cons (square-tree (car tree))
(square-tree (cdr tree))))))
测试:
1 ]=> (square-tree (list (list 1 2) (list 3 4)))
;Value 11: ((1 4) (9 16))
然后是使用 map
遍历的方式(这个函数和书本 75 的第二个 scala-tree
定义也很相似):
;;; 30-square-tree-using-map.scm
(define (square-tree tree)
(map (lambda (sub-tree)
(if (pair? sub-tree) ; 如果有左右子树
(square-tree sub-tree) ; 那么递归地处理它们
(square sub-tree)))
tree))
测试:
1 ]=> (square-tree (list (list 1 2) (list 3 4)))
;Value 11: ((1 4) (9 16))