SICP 第一章练习题解


不是参考答案,只是自己的解,可能有谬误。

练习 1.1

10

12

8

3

6

a

b

19

(= a b ) #这个猜不出来是什么结果,运行一下发现是 #f

4

16

6

16

练习 1.2

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

练习 1.3

(define (biggerTwo a b c)
  (if (< a b)
      (if (< a c)
          (+ b c)
          (+ a b))
      (if (< b c)
          (+ a c)
          (+ a b))))

Report this ad

练习 1.4

(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))

上面的定义意思是如果 b 大于 0,那么 a + b,如果 b 小于 0,那么 a – b。所以结果就是 a 加上绝对值 b。因为运算符也可以当作组合式的普通的值,所以这样做是合法的。

练习 1.5

(define (p) (p))
(define (test x y)
  (if (= x 0)
      0
      y))
# 而后求值
   (test 0 (p))

上面的程序,如果解释器采用应用序求值,那么会短路,结果为0。

上面的程序,如果解释器采用正则序求值,那么会展开式子,导致陷入无限循环。因为求值 p 会递归会自身,而这个递归没有结束条件。

Exercise 1.9. Each of the following two procedures defines a method for adding two positive integers in terms of the procedures inc, which increments its argument by 1, and dec, which decrements its argument by 1.

(define (+ a b)
  (if (= a 0)
      b
      (inc (+ (dec a) b))))

(define (+ a b)
  (if (= a 0)
      b
      (+ (dec a) (inc b))))

Using the substitution model, illustrate the process generated by each procedure in evaluating (+ 4 5). Are these processes iterative or recursive?

答:第一个函数是recursive的。第二个函数是iterative的。因为第二个没有展开和递归调用自己。第一个是递归了的。

Exercise 1.10. The following procedure computes a mathematical function called Ackermann’s function.

(define (A x y)
  (cond ((= y 0) 0)
        ((= x 0) (* 2 y))
        ((= y 1) 2)
        (else (A (- x 1)
                 (A x (- y 1))))))

What are the values of the following expressions?

(A 1 10)

(A 2 4)

(A 3 3)

Consider the following procedures, where A is the procedure defined above:

(define (f n) (A 0 n))

(define (g n) (A 1 n))

(define (h n) (A 2 n))

(define (k n) (* 5 n n))

Give concise mathematical definitions for the functions computed by the procedures f, g, and h for positive integer values of n. For example, (k n) computes 5n2.

答:(f n) 计算 2y。(g n) 计算 2的n+1次方。(h n) 计算 2的2n+2次方。

正确答案:

(f n): 2n

(g n): 0 for n=0, 2^{n} for n>0

(h n): 0 for n=0, 2 for n=1, 2^2^… (n-1 times) for n>1