SICP習題1 6的解答

2021-04-09 09:25:40 字數 1260 閱讀 7559

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