sicp就是名著「
structure and interpretation of computer programs
」 ,著名的巫師書(wizard book)和紫書(purple book)。雖說英文原版可以從網上合法
中文版翻譯也還不錯。 閒話少敘,下面我們研究一下書中
1.1.7節的練習題1.6。原題是和用牛頓法求平方根的例子相聯絡,顯得有點複雜,下面我在保持題目原意的前提下將它改得簡單一些。 假設我們寫乙個階乘函式,如下所述:
(define (n! n)
(if (= n 1) 1 (* n (n! (- n 1)))))
這是乙個遞迴實現,用它在直譯器下實驗一下:
guile> (n! 4) 24
嗯,一切正常。 這時候二愣子兄弟說話了:在scheme中本來已經有了乙個cond,為何還有if的存在必要?if完全可以由cond實現出來,如下面定義的newif:
(define (newif predication then-clause else-clause)
(cond (predication then-clause)
(else else-clause)))
二愣子兄弟做了下面一些測試,覺得newif和scheme的內建if在行為上是完全一樣的:
guile> (newif (= 1 1) 1 0) 1
guile> (newif (= 1 0) 1 0) 0
因此二愣子兄弟很自信地將newif應用到階乘程式中替代了if:
(define (n! n)
(newif (= n 1) 1 (* n (n! (- n 1)))))
可是,世事出人意料:
guile> (n! 4)
error: stack overflow
abort: (stack-overflow)
oops!天塌下來了!棧溢位了!newif完蛋了! 現在問題就是,二愣子為什麼會有如此悲慘的命運?莫非是cond惹的禍?那我們直接在n!函式中直接使用cond:
(define (n! n)
(cond ((= n 1) 1)
(else (* n (n! (- n 1))))))
咦,執行結果一切正常!也就是說,我們給cond穿了一件newif的馬甲,問題就出現了,莫非這是靈異事件? 好吧,下面我來打鬼。我們知道scheme的直譯器在一般情況下採用
本人主要更新blog:
SICP練習1 6的解答
cond和if有著同樣的效果,為啥用cond實現的new if不能用於一些函式?解答1 if和cond都是特定的求值順序,即先對判斷求值,再根據其結果選擇需要求值的部分 既不是應用序也不是正則序 new if改變了if的特殊性,如果直譯器是應用序,則引數需要先行代換,而導致問題 如果直譯器是正則序,...
SICP習題解答1 1 1 8
lang racket exercise 1.1 10 5 3 4 9 1 6 2 2 4 4 6 define a 3 define b a 1 a b a b a b if and b a b a b ba cond a 4 6 b 4 6 7 a else 25 2 if b a b a co...
SICP習題解答2 7 2 16
lang racket exercise 2.7 define make interval a b cons a b define upper bound interval max car interval cdr interval define lower bound interval min c...