练习 2.31

练习 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))

讨论

blog comments powered by Disqus