SICP 2.30 && 2.31square_list (树的平方映射)

来源:互联网 发布:推广淘宝优惠券挣钱 编辑:程序博客网 时间:2024/05/22 10:42

要求:有一棵树 (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为要进行映射的函数

0 0
原创粉丝点击