首页 > 代码库 > SICP 1.29-1.33体会
SICP 1.29-1.33体会
1.29 到1.33这5道题特别好。好在什么地方? 作者深入浅出的设计了一学习过程,特别适合学习和上手。
强烈建议大家都做做,特别精彩, 全部做完大概1-2小时,也不是很费时间。
下面是自己的作业:
1.29
(define (sympson-integral f a b n)
(define (sum term start next end)
(if (> start end)
0
(+ (term start)
(sum term (next start) next end))))
(define h (/ (- b a) n))
(define (funcY index)
(f (+ a (* index h))))
(define (termY index)
(cond ((= index 0) (funcY index))
((= index n) (funcY index))
((= (remainder index 2) 1) (* 4 (funcY index)))
(else (* 2 (funcY index)))))
(define (next-index index)
(+ index 1))
(/ (* h (sum termY 0 next-index n))
3))
1.30
(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ (term a) result))))
(iter a 0))
1.31
(define (product term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (* result (term a)))))
(iter a 1.0))
(define (product-recursive term a next b)
(if (> a b)
1.0
(* (term a)
(product-recursive term (next a) next b))))
(define (product-pi-term index)
(/ (* (+ 2.0 (* index 2))
(+ 4.0 (* index 2)))
(square (+ 3.0 (* index 2)))))
(define (next a)
(+ a 1))
(define (product-pi n)
(product product-pi-term 0 next n))
(define (product-pi-recur n)
(product-recursive product-pi-term 0 next n))
1.32
(define (accumulate-i combiner null-value term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (combiner result (term a)))))
(iter a null-value))
(define (accumulate-r combiner null-value term a next b)
(if (> a b)
null-value
(combiner (term a)
(accumulate-r combiner null-value term (next a) next b))))
(define (product-combiner x y)
(* x y))
(define (product-i term a next b)
(accumulate-i product-combiner 1.0 term a next b))
(define (product-r term a next b)
(accumulate-r product-combiner 1.0 term a next b))
(define (sum-combiner x y)
(+ x y))
(define (sum-i term a next b)
(accumulate-i sum-combiner 0 term a next b))
(define (sum-r term a next b)
(accumulate-r sum-combiner 0 term a next b))
(define (product-pi-term index)
(/ (* (+ 2.0 (* index 2))
(+ 4.0 (* index 2)))
(square (+ 3.0 (* index 2)))))
(define (next a)
(+ a 1))
(define (product-pi-i n)
(product-i product-pi-term 0 next n))
1.33
(define (filter-accumulate-i combiner null-value term a next b filter)
(define (iter a result)
(if (> a b)
result
(if (filter a)
(iter (next a) (combiner result (term a)))
(iter (next a) result))))
(iter a null-value))
(define (filter-accumulate-r combiner null-value term a next b filter)
(define (recur a)
(if (> a b)
null-value
(if (filter a)
(combiner (term a)
(recur (next a)))
(recur (next a)))))
(recur a))
(define (prime? n)
(= n (smallest-divisor n)))
(define (smallest-divisor n)
(define (find-divisor n test-divisor)
(cond ((> (square test-divisor) n) n)
((divides? test-divisor n) test-divisor)
(else (find-divisor n (+ test-divisor 1)))))
(define (divides? a b)
(= (remainder b a) 0))
(find-divisor n 2))
(define (sum-prime-i a b)
(define (next a)
(+ a 1))
(define (combine x y)
(+ x y))
(define (term x)
x)
(filter-accumulate-i combine 0 term a next b prime?))
(define (sum-prime-r a b)
(define (next a)
(+ a 1))
(define (combine x y)
(+ x y))
(define (term x)
x)
(filter-accumulate-r combine 0 term a next b prime?))
(define (gcd a b)
(if (= b 0)
a
(gcd b (remainder a b))))
(define (sum-gcd-n-i n)
(define (next x)
(+ 1 x))
(define (combine x y)
(* x y))
(define null-value 1.0)
(define (term x)
x)
(define (gcd-filter x)
(= (gcd x n) 1))
(filter-accumulate-i combine null-value term 2 next n gcd-filter))
(define (sum-gcd-n-r n)
(define (next x)
(+ 1 x))
(define (combine x y)
(* x y))
(define null-value 1.0)
(define (term x)
x)
(define (gcd-filter x)
(= (gcd x n) 1))
(filter-accumulate-r combine null-value term 2 next n gcd-filter))
SICP 1.29-1.33体会