SICP 习题 (2.31)解题总结 : 通用的Square-Tree
2016-07-16 21:50
218 查看
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))
习题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))
相关文章推荐
- Java 接口interface的详解
- Vmware虚拟机安装caffe,Ubuntu安装caffe,CPU only版本
- QT PySide 连连看小游戏
- C++之构造函数
- 【记录】DMA
- Objective-c分类
- 在eclipse中使用Tomcat8.0时出现Could not publish server ...错误
- C++实现R语言向量化运算(向量类:c 矩阵类:matrix)2015.9.11
- 企业级开源邮件系统搭建的全过程
- 竞赛排名 (Standard IO)
- 51Nod 1007 正整数分组 01背包
- 防止idea每次都默认以1.5版本编译的maven设置
- 我的Unity3D学习日记-06(自己动手制作FlappyBird)
- Maven+Spring+Spring MVC+MyBatis+MySQL,搭建SSM框架环境
- VS助手安装失败---VS番茄助手安装成功重启VS却没有效果!!!
- [c/c++]指针(4)
- verilog语法之memory存储器
- Java反射机制(取得类的结构)
- 听俞炳洪讲话
- Razor语法与布局