練習2.3
我們並不必急於寫出點什麼,先來回過頭看看書吧。第56頁說到了一種稱為按願望思維的強有力的綜合策略。在這道題裡,我們就可以假設已經寫好了能夠表示矩形的**,以及能夠求矩形長和寬的函式。
於是像先定義出add-rat一樣,我們先定義出求矩形的周長和麵機的函式。
(define(get-perimeter x)
(let ((length (rectangle-length x))
(width (rectangle-width x)))
(* 2 (+ length width))))
(define(get-area x)
(* (rectangle-length x) (rectangle-widthx)))
啊哈,書上要求用2中方式來表示矩形。我先來說說比較難看的一種表示方式,我一開始想到的下面那一種。
(define(make-ractangle rec-length-1 rec-length-2 rec-width-1 rec-width-2)
(cons (cons rec-length-1 rec-length-2)
(cons rec-width-1 rec-width-2)))
(define(rec-len-1 x)
(car (car x))
(define(rec-len-2 x)
(cdr (car x))
(define(rec-wid-1 x)
(car (cdr x))
(define(rec-wid-2 x)
(cdr (cdr x))
如書上所說,我們還要載入一下練習2.2中的**。然後我們就可以開始構造矩形了。
(definelen-1 (make-segment (make-point 0 0)
(make-point 5 0)))
(definelen-2 (make-segment (make-point 0 4)
(make-point 5 4)))
(definewid-1 (make-segment (make-point 0 0)
(make-point 0 4)))
(definewid-2 (make-segment (make-point 5 0)
(make-point 5 4)))
(definerectangle-first (make-rectangle len-1 len-2 wid-1 wid-2))
這樣列印出來的肯定是很混亂的,估計是一大堆括號的巢狀。所以還是要想書中那樣自己寫乙個列印的函式。這裡也要載入前面的print-point函式。
(define(print-rec x)
(let ((l1 (len-1 x))
(l2 (len-2 x))
(w1 (wid-1 x))
(w2 (wid-2 x)))
(newline)
(display 「length-1: 「)
(print-point (start-segment l1))
(print-point (end-segment l1))
(newline)
(display 「length-2: 「)
(print-point (start-segment l2))
(print-point (end-segment l2))
(newline)
(display 「width-1: 「)
(print-point (start-segment w1))
(print-point (end-segment w1))
(newline)
(display 「width-1: 「)
(print-point (start-segment w2))
(print-point (end-segment w2))
現在列印出來的就比較直觀了。
(print-rec rectangle-first)
length-1:
(0,0)
(5,0)
length-2:
(0,4)
(5,4)
width-1:
(0,0)
(0,4)
width-2
(5,0)
(5,4)
下面我們還需要函式來計算長和寬。
(define (get-length x)
(let((length (len-1 x)))
(let ((start (start-segment length))
(end (end-segment length)))
(- (x-point end) (x-point start)))))
(define (get-width x)
(let((width (wid-1 x)))
(let ((start (start-segment width))
(end (end-segment width)))
(- (y-point end) (y-point start)))))
下面就可以來計算長和寬了,試試吧。
(get-perimeter rectangle-first)
;value: 18
(get-area rectangle-fist)
;value: 20
這種方式真是麻煩,誰會一開始想到這種呢,還是用兩條線段簡單啊,反正是矩形又不是菱形。
(define (make-ractangle length width)
(cons length width))
(define (rec-len x)
(car x))
(define (rec-wid x)
(cdr x))
(define (get-length x)
(let((length (rec-len x)))
(let ((start (start-segment length))
(end (end-segment length)))
(- (x-point end) (x-point start)))))
(define (get-width x)
(let((width (rec-wid x)))
(let ((start (start-segment width))
(end (end-segment width)))
(- (y-point end) (y-point start)))))
現在來建立矩形也很簡單了。
(define len (make-segment (make-point 00)
(make-point 5 0)))
(define wid (make-segment (make-point 00)
(make-point 4 0)))
(define rectangle-second(make-rectangle len wid))
SICP練習 44 練習2 3
練習2.3 我們並不必急於寫出點什麼,先來回過頭看看書吧。第56頁說到了一種稱為按願望思維的強有力的綜合策略。在這道題裡,我們就可以假設已經寫好了能夠表示矩形的 以及能夠求矩形長和寬的函式。於是像先定義出add rat一樣,我們先定義出求矩形的周長和麵機的函式。define get perimete...
SICP練習 23 練習1 29
練習1.29 這道題的數學氣息比較濃厚。像變數h和函式y在書中已經有了定義,並且n是偶數。另外通過觀察我們發現當k等於0或者n時,y的係數為1 當k為偶數時,y的係數為2 當k為奇數時 在函式中直接用else也可以 y的係數為4。根據書中前面的講解,需要有乙個term作用在a上,還要有乙個next來...
SICP練習 7 練習1 11
這種題目太像是數學題目了,不過拿到程式設計上又有一些的難度。我們先根據題目中的條件,寫出類似於第 25頁最下面的變換規則。我們先列出如下內容 a f n 1 f 2 f 3 f 4 f 5 b f n 2 f 1 f 2 f 3 f 4 c f n 3 f 0 f 1 f 2 f 3 於是繼而得出下...