SICP学习笔记 第一章 (1.1)

语言的三个机制:

  • 基本表达式 (primitive expression)
  • 组合 (combination)
  • 抽象 (abstraction)

组合式:由括号括起的一些表达式,形成的表。表中最左边的元素称为运算符(operator),其他元素称为运算对象(operand)。

过程定义的一般形式:(define (<name> <formal parameters>) <body>)

应用序(application order):求值参数而后应用

正则序(normal order):完全展开而后归约

特殊形式(special form):

1 (define (<name> <formal parameters>) <body>)
2 (cond (<p1> <e1>)
3       (<pn> <en>))
4 (if <predicate> <consequent> <alternative>)
5 (and <e1> ... <en>)
6 (or <e1> ... <en>)
7 (not <e>)

 部分习题:

exercise 1.3

1 (define (square-sum-of-two x y z)
2     (+ (square (max x y))
3        (square (max z
4                (min x y)))))

 exercise 1.5

1 (define (p) (p))
2 (define (test x y)
3     (if (= x 0)
4         0
5         y))
6 (test 0 (p))

  在应用序求值中,解释器会先对各个子表达式求值。在对(p)求值时就会陷入无限循环。而正则序会先展开而后归约,(test 0 (p)) 会先展开成 if 的特殊形式,再根据 if 的求值规则:谓词部分先求值,根据谓词结果选择子表达式,这样正则序求值会返回0.

exercise 1.6

Lisp使用应用序求值,而new-if不是一个特殊形式,求值过程中会不断对子表达式求值形成无限循环。

exercise 1.7

没想明白改变值相对于猜测值的比率应该怎么表示,暂时用改变值和猜测值的差代替。

 1 (define (sqrt x)
 2     (define (good-enough? guess)
 3         (< (abs (- guess (improve guess))) 0.0001))
 4     (define (improve guess)
 5         (/ (+ guess 
 6               (/ x guess))
 7            2))
 8     (define (sqrt-iter guess)
 9         (if (good-enough? guess)
10             guess
11             (sqrt-iter (improve guess))))
12     (sqrt-iter 1.0))

 exercise 1.8

 1 (define (cube-root x)
 2     (define (good-enough? guess)
 3         (< (abs (- guess (improve guess))) 0.0001))
 4     (define (improve guess)
 5         (/ (+ (/ x
 6                  (square guess))
 7               (* 2 guess))
 8            3))
 9     (define (cube-root-iter guess)
10         (if (good-enough? guess)
11             guess
12             (cube-root-iter (improve guess))))
13     (cube-root-iter 1.0))
原文地址:https://www.cnblogs.com/sungoshawk/p/2743904.html