第一章未整理,先放到这里
;; ex1.3
(define (sq x)(* x x))
(define (greater-two-sqrt-sum a b c)
(let ((x (min a b c)))
(cond ((= x a) (+ (sq b) (sq c)))
((= x b) (+ (sq a) (sq c)))
((= x c) (+ (sq b) (sq a))))))
;; ex1.4;没有区分符号和函数???
;; ex1.5
;应用序 -> recurse forever
;正则序 -> 0
;; 1.1.7 eg 牛顿法求平方根
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))
(define (good-enough? guess x)
(< (abs (- (sq guess) x)) 0.001))
(define (improve guess x)
(/ (+ guess (/ x guess)) 2))
(define (my-sqrt x)
(sqrt-iter 1.0 x))
;; ex1.7
(define (good-enough? guess prev-guess)
(< (/ (abs (- guess prev-guess)) guess) 0.001))
(define (sqrt-iter guess x prev-guess)
(if (good-enough? guess prev-guess)
guess
(sqrt-iter (improve guess x) x guess)))
(define (my-sqrt x)
(sqrt-iter 1.0 x 0))
;; ex1.8
(define (cbrt-iter guess x)
(if (good-enough-cbrt? guess x)
guess
(cbrt-iter (improve-cbrt guess x) x)))
(define (good-enough-cbrt? guess x)
(< (abs (- (* guess (sq guess)) x)) 0.001))
(define (improve-cbrt guess x)
(/ (+ (/ x (sq guess)) (* 2 guess)) 3))
(define (my-cbrt x)
(cbrt-iter 1.0 x))
;; ex 1.9
; 2 是尾递归
;; ex 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) -> 2^10
;(A 2 4) -> 2^16
;(A 3 3) -> 2^16
;(define (f n) (A 0 n)) -> 2*n
;(define (g n) (A 1 n)) -> 2^n
;(define (h n) (A 2 n)) -> 2^(2^(2^....(2^2)..))
;; ex 1.11
(define (f n)
(define (f-iter a b c i)
(if (= i n)
c
(f-iter b c (+ c b a) (+ i 1))))
(if (< n 4)
n
(f-iter 1 2 3 3)))
;; ex 1.12
(define (pascal row col)
(if (or (= col 0) (= col row))
1
(+ (pascal (1- row) col)
(pascal (1- row) (1- col)))))
;;1.2.4
(define (square x)
(let ((z x))
(* z z)))
(define (fast-expt b n)
(cond ((= n 0) 1)
((even? n) (square (fast-expt b (/ n 2))))
(else (* b (fast-expt b (1- n))))))
;; ex 1.16
(define (fast-expt-1 b n)
(fast-expt-iter b n 1))
(define (fast-expt-iter b n rec)
(cond ((= n 0) rec)
((even? n) (fast-expt-iter (square b) (/ n 2) rec))
(else (fast-expt-iter b (1- n) (* b rec)))))
;;1.17
(define (double x)
(* 2 x))
(define (halve x)
(cond ((even? x) (/ x 2))
(else 'odd)))
(define (fast-mul a b)