summaryrefslogtreecommitdiff
path: root/coding-exercises
diff options
context:
space:
mode:
Diffstat (limited to 'coding-exercises')
-rw-r--r--coding-exercises/1/21.rkt12
-rw-r--r--coding-exercises/1/22.rkt15
-rw-r--r--coding-exercises/1/23.rkt19
-rw-r--r--coding-exercises/1/24.rkt31
-rw-r--r--coding-exercises/1/27.rkt23
-rw-r--r--coding-exercises/1/28.rkt32
-rw-r--r--coding-exercises/1/29.rkt28
-rw-r--r--coding-exercises/1/30.rkt13
-rw-r--r--coding-exercises/1/31.rkt23
-rw-r--r--coding-exercises/1/33.rkt26
-rw-r--r--coding-exercises/1/35.rkt17
-rw-r--r--coding-exercises/1/36.rkt33
-rw-r--r--coding-exercises/1/39.rkt6
-rw-r--r--coding-exercises/1/40.rkt21
-rw-r--r--coding-exercises/1/41.rkt5
-rw-r--r--coding-exercises/1/42.rkt5
-rw-r--r--coding-exercises/1/43.rkt5
-rw-r--r--coding-exercises/1/44.rkt10
-rw-r--r--coding-exercises/1/45.rkt12
-rw-r--r--coding-exercises/1/46.rkt27
20 files changed, 122 insertions, 241 deletions
diff --git a/coding-exercises/1/21.rkt b/coding-exercises/1/21.rkt
index 7cda52f..4820b7a 100644
--- a/coding-exercises/1/21.rkt
+++ b/coding-exercises/1/21.rkt
@@ -1,20 +1,10 @@
#lang racket
-(require racket/pretty)
+(require "../../shared/chapter1.rkt")
(require sicp)
(define (smallest-divisor n)
(find-divisor n 2))
-(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 (square x) (* x x))
-
-(define (divides? a b)
- (= (remainder b a) 0))
-
;; (pretty-print (smallest-divisor 199))
;; (pretty-print (smallest-divisor 1999))
;; (pretty-print (smallest-divisor 19999))
diff --git a/coding-exercises/1/22.rkt b/coding-exercises/1/22.rkt
index feec18b..15a3485 100644
--- a/coding-exercises/1/22.rkt
+++ b/coding-exercises/1/22.rkt
@@ -1,20 +1,7 @@
#lang racket
-(require racket/pretty)
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (smallest-divisor n)
- (find-divisor n 2))
-
-(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 (square x) (* x x))
-
-(define (divides? a b)
- (= (remainder b a) 0))
-
(define (prime? n)
(= n (smallest-divisor n)))
diff --git a/coding-exercises/1/23.rkt b/coding-exercises/1/23.rkt
index f44c87c..15a3485 100644
--- a/coding-exercises/1/23.rkt
+++ b/coding-exercises/1/23.rkt
@@ -1,24 +1,7 @@
#lang racket
-(require racket/pretty)
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (next n)
- (if (= n 2) 3 (+ n 2)))
-
-(define (find-divisor n test-divisor)
- (cond ((> (square test-divisor) n) n)
- ((divides? test-divisor n) test-divisor)
- (else (find-divisor n (next test-divisor)))))
-
-
-(define (smallest-divisor n)
- (find-divisor n 2))
-
-(define (square x) (* x x))
-
-(define (divides? a b)
- (= (remainder b a) 0))
-
(define (prime? n)
(= n (smallest-divisor n)))
diff --git a/coding-exercises/1/24.rkt b/coding-exercises/1/24.rkt
index 9dae66c..969a135 100644
--- a/coding-exercises/1/24.rkt
+++ b/coding-exercises/1/24.rkt
@@ -1,33 +1,8 @@
#lang racket
-(require racket/pretty)
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (next n)
- (if (= n 2) 3 (+ n 2)))
-
-(define (square x) (* x x))
-
-(define (divides? a b)
- (= (remainder b a) 0))
-
-(define (find-divisor n test-divisor)
- (cond ((> (square test-divisor) n) n)
- ((divides? test-divisor n) test-divisor)
- (else (find-divisor n (next test-divisor)))))
-
-(define (smallest-divisor n)
- (find-divisor n 2))
-
-(define (prime? n)
- (= n (smallest-divisor n)))
-
-(define (expmod base e m)
- (cond
- ((= e 0) 1)
- ((even? e)
- (remainder (square (expmod base (/ e 2) m)) m))
- (else
- (remainder (* base (expmod base (- e 1) m)) m))))
+(define expmod (expmoder (lambda (b e m x) x)))
(define (fermat-test n)
(define (try-it a)
@@ -35,7 +10,7 @@
(try-it (+ 1 (random (- n 1)))))
(define (fast-prime? n times)
- (cond
+ (cond
((= times 0) true)
((fermat-test n) (fast-prime? n (- times 1)))
(else false)))
diff --git a/coding-exercises/1/27.rkt b/coding-exercises/1/27.rkt
index 5a7a8d7..63e614e 100644
--- a/coding-exercises/1/27.rkt
+++ b/coding-exercises/1/27.rkt
@@ -1,24 +1,5 @@
#lang racket
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (square x)
- (* x x))
-
-(define (expmod base e m)
- (cond
- ((= e 0) 1)
- ((even? e)
- (remainder (square (expmod base (/ e 2) m)) m))
- (else
- (remainder (* base (expmod base (- e 1) m)) m))))
-
-(define (fermat? a n)
- (= (expmod a n n) a))
-
-(define (all-fermat n)
- (define (f a n)
- (cond
- ((= a 0) true)
- ((fermat? (- a 1) n) (f (- a 1) n))
- (else false)))
- (f n n))
+(all-fermat 561)
diff --git a/coding-exercises/1/28.rkt b/coding-exercises/1/28.rkt
index 4e984fb..e6d5ba9 100644
--- a/coding-exercises/1/28.rkt
+++ b/coding-exercises/1/28.rkt
@@ -1,33 +1,5 @@
#lang racket
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (square x)
- (* x x))
-
-(define (signal b e m x)
- (cond
- ((= e (- m 1)) x) ;; end result
- ((= b (- m 1)) x) ;; base squared wil result in trivial root
- ((= x 1) 0) ;; non-trivial root
- (else x))) ;; no root found
-
-(define (expmod base e m)
- (cond
- ((= e 0) 1)
- ((even? e)
- (signal base e m (remainder (square (expmod base (/ e 2) m)) m)))
- (else
- (remainder (* base (expmod base (- e 1) m)) m))))
-
-(define (mr a n)
- (= (expmod a (- n 1) n) 1))
-
-(define (all-mr n)
- (define (f a n)
- (cond
- ((<= a 2) true)
- ((mr (- a 1) n) (f (- a 1) n))
- (else false)))
- (f n n))
-
-(all-mr 5)
+(all-miller-raban 561)
diff --git a/coding-exercises/1/29.rkt b/coding-exercises/1/29.rkt
index b0d3ab8..80351cc 100644
--- a/coding-exercises/1/29.rkt
+++ b/coding-exercises/1/29.rkt
@@ -1,34 +1,12 @@
#lang racket
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (id x) x)
-
-(define (sum term a next b)
- (if (> a b)
- 0
- (+ (term a)
- (sum term (next a) next b))))
-
-(define (simpson f lower upper n)
- (define (h)
- (/ (- upper lower) n))
- (define (term a)
- (cond
- ((= a 0) (f a))
- ((= a upper) (f a))
- ((even? a) (* 2 (f a)))
- (else (* 4 (f a)))))
-
- (* (/ (h) 3.0)
- (sum term lower inc upper)))
-
(define (cube x) (* x x x))
(define (integral f a b dx)
(define (add-dx x) (+ x dx))
(* (sum f (+ a (/ dx 2.0)) add-dx b) dx))
-(integral cube 0 1 100)
-(println "")
-(simpson cube 0 1 100)
+(integral cube 0 1 0.0001)
(println "")
-(simpson cube 0 1 1000)
+(simpson cube 0 1.0 500)
diff --git a/coding-exercises/1/30.rkt b/coding-exercises/1/30.rkt
index 09b354e..fd9176d 100644
--- a/coding-exercises/1/30.rkt
+++ b/coding-exercises/1/30.rkt
@@ -1,14 +1,5 @@
#lang racket
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (sum term a next b)
- (define (iter a result)
- (if (> a b)
- result
- (iter (next a) (+ result (term a)))))
- (iter a 0))
-
-
-(define (id x) x)
-
-(sum id 0 (lambda (x) (+ x 1)) 2)
+(sum (lambda (x) x) 0 inc 2)
diff --git a/coding-exercises/1/31.rkt b/coding-exercises/1/31.rkt
index 10f52c5..18b5170 100644
--- a/coding-exercises/1/31.rkt
+++ b/coding-exercises/1/31.rkt
@@ -1,26 +1,15 @@
#lang racket
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (id x) x)
-
(define (factorial n)
- (product id 1 inc n))
-
-(define (product term a next b)
- (define (iter result a)
- (if (> a b)
- result
- (iter (* (term a) result) (next a))))
- (iter 1 a))
-
-(define (even? x)
- (= (remainder x 2) 0))
+ (product (lambda (x) x) 1 inc n))
(define (pi-product n)
- (/ (product (lambda (x)
- (if (even? x)
- x
- (+ x 1)))
+ (/ (product (lambda (x)
+ (if (even? x)
+ x
+ (+ x 1)))
2 inc n)
(product (lambda (x)
(if (even? x)
diff --git a/coding-exercises/1/33.rkt b/coding-exercises/1/33.rkt
index ff82408..702e5cd 100644
--- a/coding-exercises/1/33.rkt
+++ b/coding-exercises/1/33.rkt
@@ -1,22 +1,10 @@
#lang racket
-;; import miller raban prime test
-(load "coding-exercises/1/28.rkt")
+(require "../../shared/chapter1.rkt")
+(require sicp)
;; sum of squares of the prime numbers in the interval a to b
(define (prime? x)
- (all-mr x))
-
-(define (filtered-accumulate pred combiner null-value term a next b)
- (define (iter a result)
- (cond
- ((> a b) result)
- ((pred a) (iter
- (next a)
- (combiner
- (term a)
- result)))
- (else (iter (next a) result))))
- (iter a null-value))
+ (all-miller-raban x))
(define (square-prime-sum a b)
(filtered-accumulate
@@ -29,14 +17,8 @@
(square-prime-sum 2 5)
(define (coprime-product n)
- (define (coprime? a)
- (if (= 1 (gcd a n))
- ((lambda ()
- (println a)
- true))
- false))
(filtered-accumulate
- coprime?
+ (coprimer n)
(lambda (x y) (* x y))
1
(lambda (x) x)
diff --git a/coding-exercises/1/35.rkt b/coding-exercises/1/35.rkt
index 2f597c7..71ea624 100644
--- a/coding-exercises/1/35.rkt
+++ b/coding-exercises/1/35.rkt
@@ -1,20 +1,5 @@
#lang racket
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (fixed-point f first-guess)
- (define (close-enough? v1 v2)
- (< (abs (- v1 v2)) 0.0001))
- (define (try guess)
- (let ((next (f guess)))
- (if (close-enough? guess next)
- next
- (try next))))
- (try first-guess))
-
-(define (golden-ratio)
- (fixed-point
- (lambda (x) (+ 1 (/ 1 x)))
- 1.0))
-
(golden-ratio)
-(/ (log 10) (log 2))
diff --git a/coding-exercises/1/36.rkt b/coding-exercises/1/36.rkt
index a785d8a..98c6346 100644
--- a/coding-exercises/1/36.rkt
+++ b/coding-exercises/1/36.rkt
@@ -1,37 +1,22 @@
#lang racket
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (fixed-point damper f first-guess)
- (define (close-enough? v1 v2)
- (< (abs (- v1 v2)) 0.0001))
- (define (try guess)
- (let ((next (damper guess (f guess))))
- (newline)
- (display next)
- (if (close-enough? guess next)
- next
- (try next))))
- (try first-guess))
-
-(define (golden-ratio)
- (fixed-point
- (lambda (x) (+ 1 (/ 1 x)))
- 1.0))
+(golden-ratio)
(define (log1000)
(fixed-point
- (lambda (guess next)
- next)
- (lambda (x) (/ (log 1000) (log x)))
+ (lambda (x)
+ (println x)
+ (/ (log 1000) (log x)))
2.0))
(define (log1000-average-damped)
- (define (average a b)
- (/ (+ a b) 2))
(fixed-point
- (lambda (guess next)
- (average guess next))
- (lambda (x) (/ (log 1000) (log x)))
+ (average-damp
+ (lambda (x)
+ (println x)
+ (/ (log 1000) (log x))) 1)
2.0))
(log1000)
diff --git a/coding-exercises/1/39.rkt b/coding-exercises/1/39.rkt
index 90f9908..900a9b6 100644
--- a/coding-exercises/1/39.rkt
+++ b/coding-exercises/1/39.rkt
@@ -1,9 +1,7 @@
#lang racket
+(require "../../shared/chapter1.rkt")
(require sicp)
-(define (odd? i)
- (= 1 (remainder i 2)))
-
;; iter up
(define (cont-frac n d k)
(define (iter result i)
@@ -17,7 +15,7 @@
;; test
(define (tan-cf x k)
(cont-frac
- (lambda (i)
+ (lambda (i)
(cond
((= i 1) x)
((> i 1) (* -1 (* x x)))
diff --git a/coding-exercises/1/40.rkt b/coding-exercises/1/40.rkt
new file mode 100644
index 0000000..8e69ab8
--- /dev/null
+++ b/coding-exercises/1/40.rkt
@@ -0,0 +1,21 @@
+#lang racket
+(require "../../shared/chapter1.rkt")
+(require sicp)
+
+(define deriv (deriver 0.00001))
+
+(define (newtons-method g guess)
+ (define (newton-transform f)
+ (lambda (x)
+ (- x (/ (f x) ((deriv f) x)))))
+
+ (fixed-point (newton-transform g) guess))
+
+(define (cubic a b c)
+ (lambda (x)
+ (+ (cube x) (* a (square x)) (* b x) c)))
+
+(define (cube-root a b c guess)
+ (newtons-method (cubic a b c) guess))
+
+(cube-root 1 1 1 1)
diff --git a/coding-exercises/1/41.rkt b/coding-exercises/1/41.rkt
new file mode 100644
index 0000000..893d01b
--- /dev/null
+++ b/coding-exercises/1/41.rkt
@@ -0,0 +1,5 @@
+#lang racket
+(require "../../shared/chapter1.rkt")
+(require sicp)
+
+(((double (double double)) inc) 5)
diff --git a/coding-exercises/1/42.rkt b/coding-exercises/1/42.rkt
new file mode 100644
index 0000000..3b75a8c
--- /dev/null
+++ b/coding-exercises/1/42.rkt
@@ -0,0 +1,5 @@
+#lang racket
+(require "../../shared/chapter1.rkt")
+(require sicp)
+
+((compose square inc) 6)
diff --git a/coding-exercises/1/43.rkt b/coding-exercises/1/43.rkt
new file mode 100644
index 0000000..79f4cba
--- /dev/null
+++ b/coding-exercises/1/43.rkt
@@ -0,0 +1,5 @@
+#lang racket
+(require "../../shared/chapter1.rkt")
+(require sicp)
+
+((repeated square 2) 5)
diff --git a/coding-exercises/1/44.rkt b/coding-exercises/1/44.rkt
new file mode 100644
index 0000000..8ee3034
--- /dev/null
+++ b/coding-exercises/1/44.rkt
@@ -0,0 +1,10 @@
+#lang racket
+(require "../../shared/chapter1.rkt")
+(require sicp)
+
+
+(define smooth (smoother 0.00001))
+
+((repeated square 2) 5)
+((smooth square) 5)
+(((repeated smooth 3) square) 5)
diff --git a/coding-exercises/1/45.rkt b/coding-exercises/1/45.rkt
new file mode 100644
index 0000000..e438bdb
--- /dev/null
+++ b/coding-exercises/1/45.rkt
@@ -0,0 +1,12 @@
+#lang racket
+(require "../../shared/chapter1.rkt")
+(require sicp)
+
+(define (root-finder x n damp-fold)
+ (fixed-point
+ (average-damp
+ (lambda (y) (/ x (power y (- n 1))))
+ damp-fold)
+ 1.0))
+
+(root-finder 2 64 6)
diff --git a/coding-exercises/1/46.rkt b/coding-exercises/1/46.rkt
new file mode 100644
index 0000000..ffb625c
--- /dev/null
+++ b/coding-exercises/1/46.rkt
@@ -0,0 +1,27 @@
+#lang racket
+(require "../../shared/chapter1.rkt")
+(require sicp)
+
+(define (sqrt x)
+ ((iterative-improve
+ (close-enough? 0.0001)
+ (lambda (g)
+ (/ (+ g (/ x g)) 2)))
+ 1.0))
+
+(sqrt 2)
+
+(define (fixed-point f first-guess)
+ ((iterative-improve
+ (close-enough? 0.0001)
+ f)
+ first-guess))
+
+(define (root-finder x n damp-fold)
+ (fixed-point
+ (average-damp
+ (lambda (y) (/ x (power y (- n 1))))
+ damp-fold)
+ 1.0))
+
+(root-finder 2 64 6)