程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> SICP 習題 (2.1) 解題總結

SICP 習題 (2.1) 解題總結

編輯:C++入門知識

SICP 習題 (2.1) 解題總結


SICP 習題 2.1 要求我們做一個可以正確處理正數和負數的make-rat過程,用於生成一個有理數。條件是分母必須是正數。


完成這道題本身比較簡單,就是簡單修改一下書中的make-rat過程就可以了。


書中原本的make-rat過程如下:


(define (make-rat n d)
	(cons n d))


可以發現,原來的make-rat就是簡單地將n和d組成一個序對,然後返回這個序對,並沒有對分子和分母進行判斷。


我們要做的就是修改make-rat過程,判斷一下分母d是不是小於0,如果分母小於0,則同時求分子和分母的相反數,用cons串起來就好了,代碼如下:


(define (make-rat n d)
  (if (< d 0)
      (cons (- n) (- d))
      (cons n d)))


不過我們做題目不能只是以完成題目為目的,我們做題目是希望更好地理解書中講述的內容。


SICP一書在這個小節主要講得就是數據抽象,讓我們了解復雜數據的組織、保存和獲取的方法。其次是讓大家了解,相同的數據可以使用不同的方式來保存。


這裡面同學們一般會有兩個疑問:

第一個疑問是為什麼需要自己處理有理數,Scheme中不是可以處理有理數嗎?

第二個疑問就是為什麼要使用cons來將分子和分母連接起序對?


有關第一個疑問,我們需要了解SICP一書的主旨。SICP這本書是向我們講解計算機程序的結構和解析方法,是希望我們可以通過這本書的學習了解開發一門語言的整個過程。所以說,雖然Scheme已經可以支持有理數,作者還是希望我們通過Scheme去實現自己的有理數模塊。打個比方,就好像你和一個鐵匠學習鐵器技藝,你師父給你一個鐵錘和一塊生鐵,要你做個鐵錘出來,並不是說你師父沒有鐵錘用,你師父有個錘子!他只是希望你學會如何使用鐵錘把一塊生鐵做成鐵錘。


這個觀念在整本書的閱讀過程中都要保持清晰,後面我們還會面對很多這樣的需求,比如用Scheme做一個Scheme出來。。。。





有關第二個疑問,就是為什要使用cons,這個說實在話,在Lisp中,在Scheme中,用於組織數據的方法並不多,甚至可以說只有cons一種。

SICP一書在後面的章節中也介紹了更多的數據組織方法,包括列表,表,樹等。不過,在Scheme中,以上這些數據結構最終還是由cons完成的。就是說,用cons組成的序對是Scheme裡地原始數據結構,其它的數據結構都是由序對這個數據結構組成的。


所以,我們需要好好理解序對的作用。


正像書中說的,序對其實很簡單,就是使用cons連接起來的兩個數據,第一個數據可以通過car指令獲得,第二個數據可以通過cdr指令獲得。

這裡要注意,cons連接的數據可以是基本數據,也可以是另一個序對。


有關car和cdr的這兩個指令名稱的來源,可以看看書中的注釋68,看完你就知道,原來Lisp的歷史是如此的悠久。另外就是有關這兩個指令的讀法,car就像我們讀英文“汽車 car”那樣讀,cdr讀起來比較麻煩,因為它單詞裡沒有元音,大概的讀音是“酷的”這樣,如果希望了解cdr的准確讀法,可以去看看MIT的原版SICP的視頻。


雖然序對很簡單,但是它的作用卻很大。

如果我們把一個單一的數據比作是一個點的話,cons命令就好像是一條線,可以將兩個點連接起來的線。

只要我們有了連線這樣的工具,我們就可以將不同的點連接起來,連接成不同的結構,比如我們可以連出一個“樹型結構”,或者是連出一個“隊列結構”。


這也是抽象的力量,對不同數據結構的構成進行抽象,我們會發現構成不同數據結構的根本元素就是“點”和“線”,在Lisp中,基礎數據就是“點”,cons就是“線”。所謂“序對”,就是用一條線連接起來的兩個點。


以上就是SICP 2.1的總結了,關鍵還是理解“序對”這個概念。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved