SICP練習 2 練習1 6

2022-04-11 04:02:25 字數 1136 閱讀 2679



練習1.6

這道題通過由乙個新版本的

if來引出,主要討論的還是應用序和正則序的問題。我看到「將

if提供為一種特殊形式」時還滿頭霧水,並不太清楚什麼特殊形式。當再返回看

if的語法時才發現,這在第12頁

if的一般表示式下面一段。如果

得到真值,直譯器就去求值

並返回其值。注意,在此處已經返回其值了,並沒有進行後續運算。

而通過cond

寫出來的常規過程的

if,在直譯器採用應用序求值的情況下,如果第一次運算

good-enough?

時為真,則直接返回了

guess

。原文中的求平方根的程式:

(define (new-if predicate then-clauseelse-clause)

(cond(predicate then-clause)

(elseelse-clause)))

(define (sqrt-iter guess x)

(new-if(good-enough? guess x)

guess

(sqrt-iter (improve guess x)

x)))

(define(sqrt-iter guess x)

(if(good-enough? guess x)

guess

(sqrt-iter (improve guess x)

x)))

於是博主進行了如下測試:

(sqrt-iter 3.00009155413 9)

;aborting!: maximum recursion depthexceeded

由此看來,直譯器直接得出了超過最大遞迴深度的中止結果。

對此並不理解,後來才發現

3.00009155413

的平方減去

9其結果為

0.000549333162

並不小於

0.0001

。於是又將

3.000001

的平方當作

guess

傳入sqrt-iter

,結果再次出乎意料,依舊是超過最大遞迴深度。

希望弄清楚這個問題的網友們能夠予以回覆咯。

SICP練習1 6的解答

cond和if有著同樣的效果,為啥用cond實現的new if不能用於一些函式?解答1 if和cond都是特定的求值順序,即先對判斷求值,再根據其結果選擇需要求值的部分 既不是應用序也不是正則序 new if改變了if的特殊性,如果直譯器是應用序,則引數需要先行代換,而導致問題 如果直譯器是正則序,...

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