File tree Expand file tree Collapse file tree 24 files changed +1337
-0
lines changed Expand file tree Collapse file tree 24 files changed +1337
-0
lines changed Original file line number Diff line number Diff line change
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
+
Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change
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 ))
Original file line number Diff line number Diff line change
1
+ #lang sicp
2
+
3
+ (define (gcd a b)
4
+ (if (= b 0 )
5
+ a
6
+ (gcd b (remainder a b))))
Original file line number Diff line number Diff line change
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 ))
Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change
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 )))
You can’t perform that action at this time.
0 commit comments