SICP 习题 (2.31)解题总结 : 通用的Square-Tree

SICP  习题 2.31 秉承该书一直以来的抽象作风,要求读者对习题2.30的结果进行抽象,使square-tree这种形式的过程更加通用。


习题2.30中的square-tree只能对树状列表求平方,不能执行其他操作,但是我们可以发现其实使用map遍历树状列表的操作是通用的,只要我们将square换成其他过程就可以执行其他操作了。


而Lisp里强大的将过程当做数据的功能可以帮助我们把square换成一个变量,由传入的参数来决定这个变量是什么。


我们可以定义一个tree-map过程,接收两个参数,一个是需要执行的操作,一个是作为操作目标的树状列表。

代码如下:

(define (tree-map method tree)
  (map (lambda (i)
	 (if (list? i)
	     (tree-map method i)
	     (method i))) tree))


这样就可以通过传入不同的method决定对列表执行什么操作了。


然后用下面的过程包装一下就可以继续完成square-tree的工作:


(define (new-square-tree input-list)
  (tree-map square input-list))

(define (square x)
  (* x x))



你可能感兴趣的:(Lisp,Scheme,SICP)