SICP 习题 (2.4) 解题总结:序对的过程性表示
2014-09-26 00:59
232 查看
SICP 习题 2.4 是一道很有意思的题目,它在一定程度上会改变你对数据结构的认识。按题目的说法,这里讲到的是“序对的过程性表示”。
序对大家应该熟悉了,前面几道题都和序对有关系,那序对的“过程性表示”是什么意思呢?简单一点说就是用一种过程(或者说函数啦)来实现序对。
在此之前,对于很多程序员来讲,数据是数据,过程是过程,两者是单独存在的,过程一般是用来访问数据的。像这里讲到的使用一个过程来实现数据结构真是一件奇怪的事情。
先看看题目给出的样例吧,题目说到,如果我们有下面这些个过程定义,那么,对于任意的x 和y , (car(cons x y))都将产生x:
上面的代码阅读起来还是有些困难的,因为涉及到两个lambda过程就像题目说到的,为了更好地理解这里的过程,建议使用代换的方式,我们来看看代换的过程:
(car(cons x y))=> (car (lambda (m) (m x y)))=> ((lambda (m) (m x y)) (lambda (p q) p))=> ((lambda (p q) p) x y)=>((lambda (x y) x))=> x
我第一次做完这个代换过程后都觉得不可思议,感觉就像是眼睁睁看着扑克牌从刘谦手里消失一样。
这里cons返回的是一个lambda函数,这个lambda函数接受一个参数,将这个参数作用于x y。而car 接受一个参数,将这个参数作用于另一个lambda函数,这个lambda函数接受两个参数,永远返回第一个参数。将cons和car连接起来使用就是“作用于x y,永远返回第一个参数x”。
这个想明白了以后完成题目就比较简单了,题目要求我们按这个思路去定义对应cdr过程,我定义的cdr代码如下:
意思就是cdr接受一个参数,将这个参数作用于一个lambda过程,该lambda过程接受两个参数,永远返回第二个参数。
这样题目就完成了,不过关于这道题给我们带来的启发还是值得我们仔细琢磨。
完成题目容易,理解题目的用意不易。。。。。。
序对大家应该熟悉了,前面几道题都和序对有关系,那序对的“过程性表示”是什么意思呢?简单一点说就是用一种过程(或者说函数啦)来实现序对。
在此之前,对于很多程序员来讲,数据是数据,过程是过程,两者是单独存在的,过程一般是用来访问数据的。像这里讲到的使用一个过程来实现数据结构真是一件奇怪的事情。
先看看题目给出的样例吧,题目说到,如果我们有下面这些个过程定义,那么,对于任意的x 和y , (car(cons x y))都将产生x:
(define (cons x y) (lambda (m) (m x y))) (define (car z) (z (lambda (p q) p)))
上面的代码阅读起来还是有些困难的,因为涉及到两个lambda过程就像题目说到的,为了更好地理解这里的过程,建议使用代换的方式,我们来看看代换的过程:
(car(cons x y))=> (car (lambda (m) (m x y)))=> ((lambda (m) (m x y)) (lambda (p q) p))=> ((lambda (p q) p) x y)=>((lambda (x y) x))=> x
我第一次做完这个代换过程后都觉得不可思议,感觉就像是眼睁睁看着扑克牌从刘谦手里消失一样。
这里cons返回的是一个lambda函数,这个lambda函数接受一个参数,将这个参数作用于x y。而car 接受一个参数,将这个参数作用于另一个lambda函数,这个lambda函数接受两个参数,永远返回第一个参数。将cons和car连接起来使用就是“作用于x y,永远返回第一个参数x”。
这个想明白了以后完成题目就比较简单了,题目要求我们按这个思路去定义对应cdr过程,我定义的cdr代码如下:
(define (cdr z) (z (lambda (p q) q)))
意思就是cdr接受一个参数,将这个参数作用于一个lambda过程,该lambda过程接受两个参数,永远返回第二个参数。
这样题目就完成了,不过关于这道题给我们带来的启发还是值得我们仔细琢磨。
完成题目容易,理解题目的用意不易。。。。。。
相关文章推荐
- SICP 习题(1.5)解题总结:应用序和正则序
- SICP 习题 (1.6) 解题总结
- SICP 习题 (1.16)解题总结
- SICP 习题 (1.20) 解题总结
- SICP 习题 (1.19) 解题总结
- SICP 习题(1.1,1.2,1.3,1.4)解题总结,起步。
- SICP 习题 (1.24) 解题总结
- SICP 习题 (1.15) 解题总结
- SICP 习题 (1.14)解题总结
- SICP 习题 (1.22) 解题总结
- SICP 习题 (1.7) 解题总结:改进版的牛顿法求平方根
- SICP 习题 (1.9) 解题总结
- SICP 习题 (1.9) 解题总结:迭代计算过程和递归计算过程
- SICP 习题 (1.14)解题总结
- SICP习题 (1.12)解题总结
- SICP 习题 (1.6) 解题总结:对if语句的特殊处理
- SICP 习题 (1.8) 解题总结
- SICP 习题 (1.10)解题总结
- SICP 习题 ( 1.17) 解题总结
- SICP 习题 (1.23) 解题总结