1. 程式人生 > >計算機程式的構造和解釋練習題

計算機程式的構造和解釋練習題

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:

這題我看半天都不知道問題出在什麼地方,然後去百度了一下答案,然後又回去翻ifcond的定義,還是不大理解為什麼不對。

(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))