计算机程序的构造和解释练习题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014680513/article/details/50997036

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

猜你喜欢

转载自blog.csdn.net/u014680513/article/details/50997036
今日推荐