SICP練習 1 練習1 1 練習1 5

2021-06-28 14:38:07 字數 1631 閱讀 4739



練習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...