練習1.1
這道題主要是關於簡單的數字運算,我們看完之後可以在
mit-scheme
中進行驗算。如果環境不熟悉,可以參見【
scheme
歸納】的第一篇博文。如果發現在
mit-scheme
等環境上的運算結果和自己算的不一樣,也應該再仔細看看在書寫**的時候有沒有手誤。
練習1.2
這是一道將表示式轉換成字首形式的題目,博主最喜歡
lisp
中的一大堆括號了。寫完之後在
mit-scheme
中進行運算試試。
練習1.3
(define (sum-of-max x y z)
(cond
((and(<= x y) (<= x z)) (+ y z))
((and(<= y z) (<= y x)) (+ x z))
((and(<= z x) (<= z y)) (+ x y))))
cond和if
在書中都已經有了不少的介紹,在本篇部落格之前的文章中對
scheme
的基本語法做了一些介紹,對於閱讀
sicp
這本經典作品來說做點準備工作是挺有必要的。
練習1.4
其實看函式的名稱大概可以猜出這個意思:a加上
b的絕對值。但還是應該繼續讀下去。如果b大於
0的話則返回加號,如果小於
0的話則返回減號。返回的符號則繼續作為a和
b的運算子。
練習1.5
這道題講的是
ben bitdiddle
發明了一種檢測直譯器用的正則序還是應用序求值。通過閱讀書中的前面部分我們知道,將表示式完全展開然後將數值代入逐步運算,就是正則序求值;而將數值代入求值並逐漸展開稱為應用序求值。他定義了下面兩個過程:
(define (p) (p))
(define (test x y)
(if(= x 0)
0y))
而後他求值下面的表示式:
(test 0 (p))
博主已經在寫這篇部落格前在
mit—scheme
上驗算過結果了。並沒有出現網路上其他讀者出現的宕機情況,但是風扇也飛速運轉了。我本人倒是很喜歡這種聲音,喜歡做超大數字的運算,換電腦的時候特意選了乙個
i7的。至於為什麼沒有返回結果,這是因為如書中第
11頁第二段,
lisp
採用應用序求值。而應用序求值會先進行運算而後進行展開。在求值的時候
(p)會返回到第乙個
define
中進行求值,但你也該發現了返回的還是
(p),還是因為這是應用序求值,因此它會一直運算下去。
如果是正則序求值,在
(test 0 (p))
之後就直接進入了第二個
define
,將其全部展開:
(if (= 0 0) 0 (p))
。而根據
if的求值順序,當
predicate(= 0 0)
成立時,直接運算並返回
0(consequent)
,並不會去運算
alternative((p))
。
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 於是繼而得出下...
SICP練習 12 練習1 18
練習1.8 和前兩題一樣,依舊是只能用對數步數。而且這個迭代過程要基於加 加倍和折半運算。這乙個習題要用到前面的函式,因此最好的做法是,每次都將寫好的 儲存起來。load test1.18.scm 這行 可以用來載入 而儲存可以用c x,c w。以下是該題的 這次我們寫成塊結構 define x y...
SICP練習 17 練習1 23
練習1.23 首先我們按照題目要求來寫出相應的next函式,然後再修改find divisor函式。define next x if x 2 3 n 2 define find divisor ntest divisor cond square test divisor n n divides?te...