SICP习题解答1.9-1.19

来源:互联网 发布:macbookpro卸载软件 编辑:程序博客网 时间:2024/05/18 02:15

ex1.9-1.10

#lang racket; exercise 1.9;; 第一个是递归计算过程,第二个是迭代计算过程; exercise 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为底,做n次平方)

ex1.11-1.12

#lang racket; exercise 1.11;; 递归(define (f-rec n)  (if (< n 3)      n      (+ (f-rec (- n 1)) (* 2 (f-rec (- n 2))) (* 3 (f-rec (- n 3))))));; 迭代(define (f-iter n)  (if (< n 3)      n      (f-it 2 1 0 n)))(define (f-it a b c n)  (if (< n 3)      a      (f-it (+ a (* 2 b) (* 3 c)) a b (- n 1)))); exercise 1.12(define (YangHui-triangle row col)  (cond ((or (= col 0) (= row col)) 1)        (else (+ (YangHui-triangle (- row 1) col) (YangHui-triangle (- row 1) (- col 1))))))

ex1.14-1.9

#lang racket; exercise 1.14;; 空间O(n^2) 时间O(a^n) (a是硬币种数,n是输入值); exercise 1.15;; a) p调用5次 (p (p (p (p (p (sine 0.05))))));; b) 空间和步数为对数级别:ceil(log3(10a)); exercise 1.16(define (fast-expt b n)  (if (= n 0)      1      (iter b n 1)))(define (iter b n k)  (cond ((= n 1) (* b k))        ((even? n) (iter (* b b) (/ n 2) k))        (else (iter (* b b) (/ (- n 1) 2) (* k b)))))(define (even? n)  (= (remainder n 2) 0)); exercise 1.17(define (double n)  (+ n n))(define (halve n)  (/ n 2))(define (fast-rec-* a b)  (cond ((= b 0) 0)      ((even? b) (double (fast-rec-* a (halve b))))      (else (+ a (fast-rec-* a (- b 1)))))); exercise 1.18(define (fast-* a b)  (fast-*-iter a b 0))(define (fast-*-iter a b k)  (cond ((= b 0) k)        ((even? b) (fast-*-iter (double a) (halve b) k))        (else (fast-*-iter a (- b 1) (+ a k))))); exercise 1.19(define (fib n)    (fib-iter 1 0 0 1 n))  (define (fib-iter a b p q count)    (cond ((= count 0) b)          ((even? count)           (fib-iter a                     b                     (+ (square p) (square q)) ;; p'=p^2+q^2   q'=q^2+2pq 可以推导出来                    (+ (* 2 p q) (square q))                     (/ count 2)))          (else (fib-iter (+ (* b q) (* a q) (* a p))                          (+ (* b p) (* a q))                          p                          q                          (- count 1)))))  (define (square x) (* x x))