SICP練習 44 練習2 3

2022-04-11 03:31:53 字數 3489 閱讀 9367



練習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 於是繼而得出下...