练习1.1-练习1.9

版权声明:本文为博主原创文章,转载请注明出处,谢谢!

版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2014/01/06/2014-01-06-练习1.1-练习1.9/

访问原文「练习1.1-练习1.9

  1. 练习1.1
    这个题没有什么好说的了,只要把代码敲出来,运行一遍就可以了。
  2. 练习1.2
    这个题应该不算难吧,没有看过别人的答案,我把我的贴出来吧。
1
2
(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
(* 3 (- 6 2) (- 2 7)))

3.练习1.3我的方法是求出3个数的和,再将减去最小的数,算不上最好的方法吧,马马虎虎。

1
2
3
4
5
(define (sumofmax2 x y z)
(- (+ x y z)
(cond ((and (< x y) (< x z)) x)
((and (< y x) (< y z)) y)
(else z))))

4.练习1.4这个函数首先判断b是否大于0,根据判断结果使用加法或者减法,这也是Lisp的奇妙之出,可以将运算符作为返回值。
5.练习1.5
这个题我没有亲自试验,且从理论上分析下吧。
Scheme的解释器用的是应用序,所以在求表达式(test 0 (p))时首先会将(p)进行展开,可以看到p的实现时他自己,所以会进入一个无穷的递归,最终导致“死机”或者奔溃。
而在使用正则序时,解释器先不去求参数的值,而是将参数替换到过程中去,将过程展开,接着看展开的结果中是否还有其他过程,有的话继续展开,将过程完全展开后再进行计算,然后根据计算结果归约。
本题最后假设:特殊形式if的求值规则总是一样的。其中谓词部分先行求值,根据其结果确定随后求值的子表达式。
所以当正则序先展开为

1
2
3
(if (= 0 0)
0
(p))

时,只会求if表达式中的谓词部分,根据谓词部分再判断展开那部分,这道题的if中的谓词为t,所以不会展开(p),所以时可以终止的。6.练习1.6
这道题类似于上一题,特殊形式if的求值规则总是一样的。其中谓词部分先行求值,根据其结果确定随后求值的子表达式。但是自定义的函数new-if时没有这种求值规则的,所以会不断的展开sqrt-iter函数,而不会由于new-if中的条件判断而中止。
7.练习1.7

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(define (good-enough? guess old-guess)
(and (> (/ guess old-guess) 0.99999999999999)
(< (/ guess old-guess) 1.00000000000001)))
(define (average x y)
(/ (+ x y) 2))
(define (improve guess x)
(average guess (/ x guess)))
(define (sqrt-iter guess old-guess x)
(if (good-enough? guess old-guess)
guess
(sqrt-iter (improve guess x) guess x)))
(define (sqrt x)
(sqrt-iter 1.0 0.1 x))

8.练习1.8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(define (good-enough? guess old-guess)
(and (> (/ guess old-guess) 0.9999)
(< (/ guess old-guess) 1.0001)))
(define (improve guess x)
(/ (+ (/ x (* guess guess)) (* 2 guess)) 3))
(define (cbrt-iter guess old-guess x)
(if (good-enough? guess old-guess)
guess
(cbrt-iter (improve guess x) guess x)))
(define (cbrt x)
(cbrt-iter 1.0 0.1 x))

9.练习1.9第一个是递归计算过程,因为在无法在一开始确定inc的参数,要推迟计算。
第二个是迭代计算过程,因为在计算的过程中只需要保存参数的值就可以了。

Jerky Lu wechat
欢迎加入微信公众号