[Back]

1.1 基本元素

1.1

1.2

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

1.3

(define (max-two-numbers a b c) 
  (cond ((> a b) (+ a
                    (cond ((> b c) b)
                          (else c))))
        (else (+ b
                    (cond ((> a c) a)
                          (else c))))))

1.4

对运算符求值,这是个if语句,谓词是(> b 0),如果是真,得到+过程,否则得到-过程,然后对运算对象a和b求值,得出答案。

1.5

应用序

(test 0 (p)) =>

((if (= x 0) 0 y) 0 (p)) =>

((if (= x 0) 0 y) 0 (p)) =>

……

正则序

(test 0 (p)) =>

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

0

提到的是惰性求值的好处

1.6

会无限递归,原因:Lisp是应用序求值,对new-if的每个参数,lisp都会求值,从而会造成无限递归

1.7

对于很小的数,比如(sqrt 0.00001),由于精度要求0.001,它会返回0.002。

对于很大的数,比如(sqrt 1145141919810),由于大数的精度是很粗略的(MIT Scheme的问题?),我们会陷入死循环。

(define (good-enough?)

	(< (abs (- guess 

			(improve guess x)))

	0.001))

这个是可以正常工作的

1.8

(define (cube x) 
	(* x x x))
(define (improve guess x)
	(/ 3
		(+ (/ x
			(square guess))
	(* 2 y))))