diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2023-03-04 17:56:57 +0100 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2023-03-04 17:56:57 +0100 |
| commit | 9bb48cc50a438467ff029e1fb5726287b8408acc (patch) | |
| tree | cd40732aefb9375907fb4501166d4644adaad3f0 /coding-exercises | |
| parent | 035be9b1895133e0ffd1afdcc3a59c5d84c4b8d8 (diff) | |
refactor
Diffstat (limited to 'coding-exercises')
| -rw-r--r-- | coding-exercises/1/21.rkt | 12 | ||||
| -rw-r--r-- | coding-exercises/1/22.rkt | 15 | ||||
| -rw-r--r-- | coding-exercises/1/23.rkt | 19 | ||||
| -rw-r--r-- | coding-exercises/1/24.rkt | 31 | ||||
| -rw-r--r-- | coding-exercises/1/27.rkt | 23 | ||||
| -rw-r--r-- | coding-exercises/1/28.rkt | 32 | ||||
| -rw-r--r-- | coding-exercises/1/29.rkt | 28 | ||||
| -rw-r--r-- | coding-exercises/1/30.rkt | 13 | ||||
| -rw-r--r-- | coding-exercises/1/31.rkt | 23 | ||||
| -rw-r--r-- | coding-exercises/1/33.rkt | 26 | ||||
| -rw-r--r-- | coding-exercises/1/35.rkt | 17 | ||||
| -rw-r--r-- | coding-exercises/1/36.rkt | 33 | ||||
| -rw-r--r-- | coding-exercises/1/39.rkt | 6 | ||||
| -rw-r--r-- | coding-exercises/1/40.rkt | 21 | ||||
| -rw-r--r-- | coding-exercises/1/41.rkt | 5 | ||||
| -rw-r--r-- | coding-exercises/1/42.rkt | 5 | ||||
| -rw-r--r-- | coding-exercises/1/43.rkt | 5 | ||||
| -rw-r--r-- | coding-exercises/1/44.rkt | 10 | ||||
| -rw-r--r-- | coding-exercises/1/45.rkt | 12 | ||||
| -rw-r--r-- | coding-exercises/1/46.rkt | 27 |
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) |
