1. 程式人生 > 其它 >SICP 第一章倒數第二部分習題

SICP 第一章倒數第二部分習題

  1 #lang racket
  2 
  3 (define (sum term a next b)
  4   (if (> a b)
  5       0
  6       (+ (term a)
  7          (sum term (next a) next b))))
  8 
  9 (define (product term a next b)
 10   (if (> a b)
 11       1
 12       (* (term a)
 13          (product term (next a) next b))))
 14 
 15
(define (product-iter term a next b) 16 (define (iter a result) 17 (if (> a b) 18 result 19 (iter (next a) (* (term a) result)))) 20 (iter a 1)) 21 22 (define (factorial x) 23 (define (identity x) x) 24 (define (next k) (+ k 1)) 25 (product-iter identity 1
next x)) 26 27 (define (accumulate combiner null-value term a next b) 28 (if (> a b) 29 null-value 30 (combiner (term a) 31 (accumulate combiner null-value term (next a) next b)))) 32 33 (define (accumulate-iter combiner null-value term a next b) 34 (define (iter a result)
35 (if (> a b) 36 result 37 (iter (next a) (combiner (term a) result)))) 38 (iter a null-value)) 39 40 #| 41 (define (sum term a next b) 42 (define (combiner x y) (+ x y)) 43 (accumulate-iter combiner 0 term a next b)) 44 |# 45 46 (define (filtered-accumulate-iter combiner filtered null-value term a next b) 47 (define (iter a result) 48 (if (> a b) 49 result 50 (iter (next a) (combiner (filtered (term a)) result)))) 51 (iter a null-value)) 52 53 (define (small-divisor n) 54 (define (find-divisor n test-divisor) 55 (cond ((> (square test-divisor) n) n) 56 ((divides? test-divisor n) test-divisor) 57 (else (find-divisor n (+ test-divisor 1))))) 58 (define (divides? a b) 59 (= (remainder b a) 0)) 60 (define (square x) (* x x)) 61 (find-divisor n 2)) 62 63 (define (prime? n) 64 (= n (small-divisor n))) 65 66 (define (prime-filter n) 67 (if (prime? n) 68 n 69 0)) 70 71 (define (sum-of-prime term a next b) 72 (define (combiner x y) (+ x y)) 73 (filtered-accumulate-iter combiner prime-filter 0 term a next b)) 74 75 76 (define (solution-1 a b) 77 (define (identity x) x) 78 (define (next x) (+ x 1)) 79 (sum-of-prime identity a next b)) 80 81 ; 區間折半方法尋找方程的根 82 83 (define (abs x) 84 (if (< x 0) 85 (- x) 86 x)) 87 88 (define (close-enough? x y) 89 (< (abs (- x y)) 0.001)) 90 91 (define (average x y) 92 (/ (+ x y) 2)) 93 94 (define (positive? x) 95 (> x 0)) 96 97 (define (negative? x) 98 (< x 0)) 99 100 (define (search f neg-point pos-point) 101 (let ((midpoint (average neg-point pos-point))) 102 (if (close-enough? neg-point pos-point) 103 midpoint 104 (let ((test-value (f midpoint))) 105 (cond ((positive? test-value) 106 (search f neg-point midpoint)) 107 ((negative? test-value) 108 (search f midpoint pos-point)) 109 (else midpoint)))))) 110 111 (define (half-interval-method f a b) 112 (let ((a-value (f a)) 113 (b-value (f b))) 114 (cond ((and (negative? a-value) (positive? b-value)) 115 (search f a b)) 116 ((and (negative? b-value) (positive? a-value)) 117 (search f b a)) 118 (else 119 (error "Values are not of opposite sign" a b))))) 120 121 (half-interval-method sin 2.0 4.0) 122 123 (half-interval-method (lambda (x) (- (* x x x) (* 2 x) 3)) 124 1.0 125 2.0)