SICP練習 23 練習1 29

2022-04-11 04:02:13 字數 1378 閱讀 4118



練習1.29

這道題的數學氣息比較濃厚。像變數h和函式y在書中已經有了定義,並且n是偶數。另外通過觀察我們發現當k等於0或者n時,y的係數為1;當k為偶數時,y的係數為2;當k為奇數時(在函式中直接用else也可以),y的係數為4。根據書中前面的講解,需要有乙個term作用在a上,還要有乙個next來產生下乙個a值。下面我們依次來完成這5個部分。

(define h (/ (- b a) n))

我曾將這一部分拿來編譯過,但報錯說n未定義。由此可見採用應用序取值的lisp在採用應用序的同時還是從後往前求值的。不信的話,可以將n拿來define定義一下,會繼續報錯說a未定義而不是所b。好了我們再繼續寫後面的內容:

(define (y k) (f (+ a (* k h))))

(define (factor k)

(cond((or (= k 0) (= k n)) 1)

((even? k) 2)

(else4)))

(define (term k) (* (factor k) (y k)))

(define (next k) (+ k 1))

前文已經說了n是偶數,因此在呼叫simpson-ruler函式前應該先判斷n的正負性:當n為奇數時報錯,n為偶數時則計算並返回積分值。

(define (simpson-ruler f a b n)

(define h (/ (- b a) n))

(define (y k) (f (+ a (* k h))))

(define (factor k)

(cond ((or (= k 0) (= k n)) 1)

((even? k) 2)

(else4)))

(define (term k) (* (factor k) (y k)))

(define (next k) (+ k 1))

(if (odd? n)

(error 「error: you just input an odd number.」)

(* (/h 3) (sum term (exact->inexact 0) next n))))

exact->inexact

在【scheme歸納】2中有介紹,其用來把分數轉換為浮點數。

函式sum和函式cube我們可以直接copy書中的**。下面我們按照題目中的要求將n=100和n=1000來測試所寫的函式是否正確。

(simpson-ruler cube 0 1 100)

;value: .24999999999999992

(simpson-ruler cube 0 1 1000)

;value: .2500000000000003

通過和書中的integral對比,辛普森規則很明顯要精確得多。

SICP練習 44 練習2 3

練習2.3 我們並不必急於寫出點什麼,先來回過頭看看書吧。第56頁說到了一種稱為按願望思維的強有力的綜合策略。在這道題裡,我們就可以假設已經寫好了能夠表示矩形的 以及能夠求矩形長和寬的函式。於是像先定義出add rat一樣,我們先定義出求矩形的周長和麵機的函式。define get perimete...

SICP練習 44 練習2 3

練習2.3 我們並不必急於寫出點什麼,先來回過頭看看書吧。第56頁說到了一種稱為按願望思維的強有力的綜合策略。在這道題裡,我們就可以假設已經寫好了能夠表示矩形的 以及能夠求矩形長和寬的函式。於是像先定義出add rat一樣,我們先定義出求矩形的周長和麵機的函式。define get perimete...

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