計算機程式的構造和解釋練習題
阿新 • • 發佈:2018-10-31
0x00 序
最近在看廖雪峰老師python2.7的教程,看到lambda的時候卡了半天,不知道該怎麼理解這個表示式,而且在用C#做畢設的時候,學長分享的程式碼中也出現了這個表示式,於是去知乎上看看有沒有大牛給出一些簡單好理解的解釋。然後就發現了有人推薦閱讀SCIP這本書,以便對高階函式有更深刻的理解。我看書不習慣跳到某一章看,所以還是從頭來過,順便做做習題。因為原書使用的是Lisp的分支scheme語言,所以編譯器我們就選大家都推薦的DrRacket。
0x01 1.1節
我是小白,有什麼不對或者更簡潔的方法請不吝賜教。
練習1.2:
/ (+ (5 (+ 4(- 2(- 3(+ 6(/ 4 5)))))))(* 3(* (- 6 2)(- 2 7)))
練習1.3:
(define (max a b )
(if (> a b)
( a )
b))
(define (max3 a b c)
(cond ((> c (max a b)) c )
(else (max a b))
(define (sum_max2 a b c)
(cond
((= a (max3 a b c)) (+ a (max b c)))
((= b (max3 a b c)) (+ b (max a c)))
((= c (max3 a b c)) (+ c (max a b)))))
練習1.4:
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))
關於這段的理解就是當b>0時,(if (> b 0) + -)就等於+號,所以((if (> b 0) + -) a b))就等同於(+ a b);反之,等同於(- a b)。所以這個函式的作用等同於a + | b |。Lisp允許運算子為複合表示式的組合式都歸功於Lisp的運算子的字首表示。
練習1.5:
(define (p) (p))
(define (test x y)
(if(= x 0)
0
y))
“完全展開而後歸約”的求值模型稱為正則序求值
“先求值引數而後應用”的方式稱為應用序求值
我的理解就是,對於正則序如果沒用到某個形參的時候是不會對形參求值的,而相反應用序則會先對形參求值,再做進一步運算。
所以在這個程式中,如果答案顯示 0 ,則說明直譯器採用的是正則序。如果一直死迴圈陷入停滯,則直譯器採用的是應用序。
△練習1.6:
這題我看半天都不知道問題出在什麼地方,然後去百度了一下答案,然後又回去翻if和cond的定義,還是不大理解為什麼不對。
(if <predicate> <consequent> <alternative>)
在求值一個if表示式時,直譯器從求值其<predicate>部分開始,如果<predicate>得到真值,直譯器就去求值<consequent>並返回其值,否則它就去求值<alternative>並返回其值。
(cond (<p1> <e1>)
(<p2> <e2>)
.
.
(<pn> <en>))
先包含一個符號cond,之後跟著子句表示式對偶(<p> <e>)。在每個對偶中的第一個表示式是謂詞,它的值被解釋為真或假。先求謂詞<p1>,如果為false,那麼就去求值<p2>,如果<p2>為false則求<p3>。直到發現某個謂詞值為真。此時直譯器返回相應子句中的序列表達式<e>的值。
(define (new-if predicate then-clause else-clause)
(cond (predicate then-clause)
(else else-clause)))
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
誰能告訴我,換成new-if後的,predicate then-clause else-clause分別在新的程式碼裡表示哪些部分啊TAT
練習1.8:
(define (cube x)
(* x x x))
(define (cube-root x)
(cube-root-iter 1.0 x))
(define (cube-root-iter guess x)
(if (good-enough? guess x)
guess
(cube-root-iter (improve guess x)
x)))
(define (good-enough? guess x)
(< (abs (- (cube guess) x))
0.001))
(define (improve guess x)
(/ (+ (/ x (square guess)) (* 2 guess))
3))