1.2 写前缀形式
(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
(* 3 (- 6 2) (- 2 7)))
1.3 定义一个过程,以三个数为参数,返回其中较大两个数的平方和.
(define (sum-of-squares x y)
(+ (* x x) (* y y)))
(define (f a b c)
(cond ((> a b) (cond ((> b c) (sum-of-squares a b))
((< b c) (sum-of-squares a c))))
((< a b) (if (< a c)
(sum-of-squares b c)
(sum-of-squares a b)))))
1.4 描述以下过程
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))
根据b是否大于零来决定a和b的运算符.
1.5 解释正则序和应用序执行下列代码发生什么
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
(test 0 (p))
(define (p) (p))是一个不断调用自己的过程,因此一旦执行,就会无限循环.那么正则序和应用序的不同在于,先调用还是先展开,如果是正则序,先展开,再执行,则会输出0,因为(p)始终没有调用.而应用序则相反,先调用,那么就会进入无限循环.
实例1.1.7 牛顿法求平方根
\[f(x) = x^2-2\]为了求$x^2 = 2$的值,也就是求$x^2-2 = 0$的根.($x_n$,0)切线方程为
\[y = f^{’}(x_n)x +f(x_n)-f^{’}(x_n)x_n\]将这个直线和横轴的交点求出,这个点是$(\frac{f^{’}(x_n)x_n - f(x_n)}{f^{’}(x_n)},0)$.对于本题来说,$f(x) = x^2-2$,$f^{’}(x) = 2x$,因此$x_{n+1} = \frac{x_n+\frac{2}{x_n}}{2}$.
理论分析结束,代码如下:
(define (square-iter guess x)
(if (good-enough? guess x)
guess
(square-iter (improve guess x) x)))
(define (improve guess x)
(average guess (/ x guess)))
(define (average x y)
(/ (+ x y) 2))
(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.0001))
(define (square x)
(* x x))
1.6
运行结果显示;Aborting!: maximum recursion depth exceeded,也就是说超过了最大递归深度,自己写的new-if函数因为递归被多次调用,超过了最大的深度,因此报错.
根据书本 12 页所说, if 语句是一种特殊形式,当它的 predicate 部分为真时, then-clause 分支会被求值,否则的话, else-clause 分支被求值,两个 clause 只有一个会被求值。
而另一方面,新定义的 new-if 只是一个普通函数,它没有 if 所具有的特殊形式,根据解释器所使用的应用序求值规则,每个函数的实际参数在传入的时候都会被求值,因此,当使用 new-if 函数时,无论 predicate 是真还是假, then-clause 和 else-clause 两个分支都会被求值。
1.7
(define (good-enough? guess x)
(< (abs (/ (abs (- (square guess) x)) x)) 0.001))
1.8
(define (cube-iter guess x)
(if (good-enough? guess x)
guess
(cube-iter (improve guess x) x)))
(define (improve guess x)
(third-div (* guess 2) (/ x (square guess))))
(define (third-div x y)
(/ (+ x y) 3))
(define (good-enough? guess x)
(< (abs (/ (abs (- (cube guess) x)) x)) 0.001))
(define (square x)
(* x x))
(define (cube x)
(* x x x))
(cube-iter 1.0 8.0)