SICP 習題 (2.4) 解題總結:序對的過程性表示

SICP 習題 2.4 是一道很有意思的題目,它在一定程度上會改變你對數據結構的認識。

按題目的說法,這裏講到的是“序對的過程性表示”。


序對大家應該熟悉了,前面幾道題都和序對有關係,那序對的“過程性表示”是什麼意思呢?

簡單一點說就是用一種過程(或者說函數啦)來實現序對。


在此之前,對於很多程序員來講,數據是數據,過程是過程,兩者是單獨存在的,過程一般是用來訪問數據的。像這裏講到的使用一個過程來實現數據結構真是一件奇怪的事情。


先看看題目給出的樣例吧,題目說到,如果我們有下面這些個過程定義,那麼,對於任意的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過程接受兩個參數,永遠返回第二個參數。


這樣題目就完成了,不過關於這道題給我們帶來的啓發還是值得我們仔細琢磨。


完成題目容易,理解題目的用意不易。。。。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章