练习1.1-练习1.9

1. 练习1.1

这个题没有什么好说的了,只要把代码敲出来,运行一遍就可以了。

2. 练习1.2

这个题应该不算难吧,没有看过别人的答案,我把我的贴出来吧。

(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 5)))))
   (* 3 (- 6 2) (- 2 7)))

3.练习1.3

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

(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的求值规则总是一样的。其中谓词部分先行求值,根据其结果确定随后求值的子表达式。

所以当正则序先展开为

(if (= 0 0)
     0
    (p))

时,只会求if表达式中的谓词部分,根据谓词部分再判断展开那部分,这道题的if中的谓词为t,所以不会展开(p),所以时可以终止的。

6.练习1.6

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

7.练习1.7

(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

(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的参数,要推迟计算。

第二个是迭代计算过程,因为在计算的过程中只需要保存参数的值就可以了。

发布了179 篇原创文章 · 获赞 1 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览