SICP练习题 1.9~1.13

1.9 递归OR迭代

过程inc (将参数+1 )   过程dec (将参数 -1)

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

第一个是线性递归过程,解释器将维护一个由inc过程组成的递归轨迹。第二种是迭代计算过程,参数b保存了当前的变化量。

1.10 根据下面函数求值

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

求表达式:

(A 1 10)  : 1024

(A 2 4) : 65536

(A 3 3): 65536

(define (f    n) (A     0    n))   :  2n

(define (g    n) (A    1    n))    :  2^n

(define (h    n) (A    2    n))    :2^(2^(2^ (...2)))  (2的个数=n)(eg  (h 4) ) = 2^(2^(2^(2)))

1.11 如果 n<3  f(n) = n ,如果n>=3  ,那么 f(n) = f(n-1) + 2f(n-2)+3f(n-3)

递归计算过程:

(define (fn n)
  (cond
    ((< n 3) n)
    (else
     (+ (fn(- n 1)) (* 2 (fn(- n 2))) (* 3 (fn(- n 3)))))))

迭代计算过程:

(define (fn-inter a b c n)  //辅助过程
  (cond
    ((< n 3) c)
    (else
     (fn-inter b c (+ c (* 2 b) (* 3 a)) (- n 1)))))


(define (fn n)
  (cond
    ((< n 3) n)
  (else
  (fn-inter 0 1 2 n)))) 

1.12 计算帕斯卡三角元素值

(define pas (lambda(n k)                    //n代表行数,k代表列数
              (if (or (= k 1) (= k n))
                  1
                  (+ (pas (- n 1) (- k 1))
                     (pas (- n 1) k)))))

 1.13


中文版原题翻译遗漏 提示 :ψ=(1-√5)/2
已知,φ^2 = φ + 1, 那么 φ^n = φ^(n-1) + φ^(n-2)
同理,ψ^2 = ψ + 1, 那么 ψ^n = ψ^(n-1) + ψ^(n-2)
φ-ψ = (1+√5)/2 - (1-√5)/2 = √5

when n=0, Fib(0) = 0 =
(φ^0-ψ^0)/√5
when n=1, Fib(1) = 1 = √5/√5 = (φ-ψ)/√5
when n>2, Fib(n) = Fib(n-1) + Fib(n-2) = (φ^(n-1)-ψ^(n-1))/
√5 + (φ^(n-2)-ψ^(n-2))/√5
= ((
φ^(n-1)+(φ^(n-2))) - (ψ^(n-1)+ψ^(n-2)))/√5
= (φ^n - ψ^n)/√5

又 -1<
ψ < 0, 故 -0.5< -1/√5< ψ^n/√5 < 1/√5 <0.5 , 而 φ^n/√5 = ψ^n/√5 + Fib(n)
可知 |
φ^n/√5 - Fib(n)| < 0.5, Fib(n)是最接近φ^n/√5的整数。

你可能感兴趣的:(SICP练习题 1.9~1.13)