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