Skip to content

Commit 921ab87

Browse files
committed
add book code
1 parent cdb6831 commit 921ab87

24 files changed

+1337
-0
lines changed

SICP/Book-Code/ex-2.64.rkt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#lang sicp
2+
3+
(define (entry tree) (car tree))
4+
(define (left-branch tree) (cadr tree))
5+
(define (right-branch tree) (caddr tree))
6+
(define (make-tree entry left right)
7+
(list entry left right))
8+
9+
(define (list->tree elements)
10+
(car (partial-tree elements (length elements))))
11+
12+
(define (partial-tree elts n)
13+
(if (= n 0)
14+
(cons '() elts)
15+
(let ((left-size (quotient (- n 1) 2)))
16+
(let ((left-result (partial-tree elts left-size)))
17+
(let ((left-tree (car left-result))
18+
(non-left-elts (cdr left-result))
19+
(right-size (- n (+ left-size 1))))
20+
(let ((this-entry (car non-left-elts))
21+
(right-result (partial-tree (cdr non-left-elts)
22+
right-size)))
23+
(let ((right-tree (car right-result))
24+
(remaining-elts (cdr right-result)))
25+
(cons (make-tree this-entry left-tree right-tree)
26+
remaining-elts))))))))
27+
28+
(display (list->tree (list 1 3 5 7 9 11)))
29+

SICP/Book-Code/sc-1.1.7.rkt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#lang sicp
2+
3+
(define (sqrt-iter guess x)
4+
(if (good-enough? guess x)
5+
guess
6+
(sqrt-iter (improve guess x)
7+
x)))
8+
9+
(define (improve guess x)
10+
(average guess (/ x guess)))
11+
12+
(define (average x y)
13+
(/ (+ x y) 2))
14+
15+
(define (good-enough? guess x)
16+
(< (abs (- (square guess) x)) 0.001))
17+
18+
(define (square x) (* x x))
19+
20+
(define (sqrt x)
21+
(sqrt-iter 1.0 x))
22+
23+
; test case
24+
(sqrt 0.0001)

SICP/Book-Code/sc-1.1.8.rkt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#lang sicp
2+
3+
(define (sqrt x)
4+
(define (good-enough? guess)
5+
(< (abs (- (improve guess) guess))
6+
(* guess 0.001)))
7+
(define (improve guess)
8+
(average guess (/ x guess)))
9+
(define (average a b)
10+
(/ (+ a b) 2))
11+
(define (sqrt-iter guess)
12+
(if (good-enough? guess)
13+
guess
14+
(sqrt-iter (improve guess))))
15+
(sqrt-iter 1.0))
16+
17+
; test case
18+
(sqrt 4)
19+
(sqrt 16)
20+
(sqrt 10000)
21+
(sqrt 0.01)

SICP/Book-Code/sc-1.2.1.rkt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#lang sicp
2+
3+
(define (factorial n)
4+
(fact-iter 1 1 n))
5+
6+
(define (fact-iter product counter max-counter)
7+
(if (> counter max-counter)
8+
product
9+
(fact-iter (* product counter) (+ counter 1) max-counter)))
10+
11+
(define (factorial2 n)
12+
(define (fact-iter product counter)
13+
(if (> counter n)
14+
product
15+
(fact-iter (* product counter)
16+
(+ counter 1))))
17+
(fact-iter 1 1))
18+
19+
; test case
20+
(factorial 2)
21+
(factorial 3)
22+
(factorial 4)
23+
(factorial 5)
24+
(factorial 6)
25+
26+
(factorial2 2)
27+
(factorial2 3)
28+
(factorial2 4)
29+
(factorial2 5)
30+
(factorial2 6)

SICP/Book-Code/sc-1.2.2.rkt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#lang sicp
2+
3+
(define (fib n)
4+
(cond ((= n 0) 0)
5+
((= n 1) 1)
6+
(else (+ (fib (- n 1))
7+
(fib (- n 2))))))
8+
9+
(define (fib2 n)
10+
(define (fib-iter a b count)
11+
(if (= 0 count)
12+
b
13+
(fib-iter (+ a b) a (- count 1))))
14+
(fib-iter 1 0 n))
15+
16+
(define (count-change amount)
17+
(cc amount 5))
18+
19+
(define (cc amount kinds-of-coins)
20+
(cond ((= amount 0) 1)
21+
((or (< amount 0) (= kinds-of-coins 0)) 0)
22+
(else (+ (cc amount
23+
(- kinds-of-coins 1))
24+
(cc (- amount
25+
(first-denomination kinds-of-coins))
26+
kinds-of-coins)))))
27+
28+
(define (first-denomination kinds-of-coins)
29+
(cond ((= kinds-of-coins 1) 1)
30+
((= kinds-of-coins 2) 5)
31+
((= kinds-of-coins 3) 10)
32+
((= kinds-of-coins 4) 25)
33+
((= kinds-of-coins 5) 50)))
34+
35+
; test cases
36+
; (fib 2)
37+
; (fib 3)
38+
; (fib 4)
39+
; (fib 5)
40+
;
41+
; (fib2 2)
42+
; (fib2 3)
43+
; (fib2 4)
44+
; (fib2 5)
45+
46+
(count-change 100)

SICP/Book-Code/sc-1.2.4.rkt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#lang sicp
2+
3+
; b^n = b*b^{n-1}
4+
; b^0 = 1
5+
(define (expt-recursive b n)
6+
(if (= n 0)
7+
1
8+
(* b (expt-recursive b (- n 1)))))
9+
10+
(define (expt b n)
11+
(expt-iter b n 1))
12+
13+
(define (expt-iter b counter product)
14+
(if (= counter 0)
15+
b
16+
(expt-iter b
17+
(- counter 1)
18+
(* product b))))
19+
20+
; b^n = (b^{n/2})^2, n is even
21+
; b^n = b*b^{n-1}, n is odd
22+
; b^0 = 1
23+
(define (fast-expt b n)
24+
(cond ((= n 0) 1)
25+
((even? n) (square (fast-expt b (/ n 2))))
26+
(else (* b (fast-expt (- n 1))))))
27+
28+
(define (square x) (* x x))
29+
30+
(define (even? n)
31+
(= (remainder n 2) 0))

SICP/Book-Code/sc-1.2.5.rkt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#lang sicp
2+
3+
(define (gcd a b)
4+
(if (= b 0)
5+
a
6+
(gcd b (remainder a b))))

SICP/Book-Code/sc-1.2.6.rkt

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#lang sicp
2+
3+
(define (square n) (* n n))
4+
(define (even? n)
5+
(= (remainder n 2) 0))
6+
7+
(define (smallest-divisor n)
8+
(find-divisor n 2))
9+
10+
(define (find-divisor n test-divisor)
11+
(cond ((> (square test-divisor) n) n)
12+
((divides? test-divisor n) test-divisor)
13+
(else (find-divisor n (+ test-divisor 1)))))
14+
15+
(define (divides? a b)
16+
(= (remainder b a) 0))
17+
18+
(define (prime? n)
19+
(= n (smallest-divisor n)))
20+
21+
(prime? 10)
22+
23+
(define (expmod base exp m)
24+
(cond ((= exp 0) 1)
25+
((even? exp)
26+
(remainder (square (expmod base (/ exp 2) m))
27+
m))
28+
(else
29+
(remainder (* base (expmod base (- exp 1) m))
30+
m))))
31+
32+
(define (fermat-test n)
33+
(define (try-it a)
34+
(= (expmod a n n) a))
35+
(try-it (+ (random (- n 1)) 1)))
36+
37+
(define (fast-prime? n times)
38+
(cond ((= times 0) true)
39+
((fermat-test n) (fast-prime? n (- times 1)))
40+
(else false)))
41+
42+
(fast-prime? 10 (log 10))

SICP/Book-Code/sc-1.3.1.rkt

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
#lang sicp
2+
3+
(define (cube n)
4+
(* n n n))
5+
6+
;; (define (sum-integers a b)
7+
;; (if (> a b)
8+
;; 0
9+
;; (+ a (sum-integers (+ a 1) b))))
10+
11+
;; (define (sum-cubes a b)
12+
;; (if (> a b)
13+
;; 0
14+
;; (+ (cube a) (sum-cubes (+ a 1) b))))
15+
16+
;; (define (pi-sum a b)
17+
;; (if (> a b)
18+
;; 0
19+
;; (+ (/ 1.0 (* a (+ a 2))) (pi-sum (+ a 4) b))))
20+
21+
22+
(define (sum term a next b)
23+
(if (> a b)
24+
0
25+
(+ (term a)
26+
(sum term (next a) next b))))
27+
28+
(define (inc n) (+ n 1))
29+
(define (sum-cubes a b)
30+
(sum cube a inc b))
31+
32+
(sum-cubes 1 10)
33+
34+
(define (identity x) x)
35+
(define (sum-integers a b)
36+
(sum identity a inc b))
37+
38+
(sum-integers 1 10)
39+
40+
(define (pi-sum a b)
41+
(define (pi-term x)
42+
(/ 1.0 (* x (+ x 2))))
43+
(define (pi-next x)
44+
(+ x 4))
45+
(sum pi-term a pi-next b))
46+
47+
(* 8 (pi-sum 1 1000))
48+
49+
(define (integral f a b dx)
50+
(define (add-dx x) (+ x dx))
51+
(* (sum f (+ a (/ dx 2.0)) add-dx b)
52+
dx))
53+
54+
(integral cube 0 1 0.01)
55+
(integral cube 0 1 0.001)

SICP/Book-Code/sc-1.3.2.rkt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#lang sicp
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 (pi-sum a b)
10+
(sum (lambda (x) (/ 1.0 (* x (+ x 2))))
11+
a
12+
(lambda (x) (+ x 4))
13+
b))
14+
15+
(define (integral f a b dx)
16+
(* (sum f
17+
(+ a (/ dx 2.0))
18+
(lambda (x) (+ x dx))
19+
b)
20+
dx))
21+
22+
(define plus4
23+
(lambda (x) (+ x 4)))

0 commit comments

Comments
 (0)