要求:有一棵树 (list 1 2 3 (list (list 4) 5) 6),将其转换为树 (1 4 9 ((16) 25) 36)
方案一:二叉递归(我根据自己的理解起得名字LOL)
> (define (square_tree tree)
(cond ((null? tree) '())
((not (pair? tree))
((lambda (x) (* x x)) tree))
(else (cons (square_tree (car tree))
(square_tree (cdr tree))))))
方案二:子树缩放(也是我起的名字。。。),将树看成子树的序列,进行map操作
> (define (square_tree tree)
(map (lambda (sub_tree)
(if (pair? sub_tree)
(square_tree sub_tree)
((lambda (x) (* x x)) sub_tree)))
tree))
我们可以对这个函数进行更高阶的抽象,使其变成一个对树进行映射处理的普适过程,以第二个方法为例:
> (define (square_tree tree f)
(map (lambda (sub_tree)
(if (pair? sub_tree)
(square_tree sub_tree)
(f sub_tree)))
tree))
其中f为要进行映射的函数