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