diff options
| author | Mike Vink <mike1994vink@gmail.com> | 2023-03-03 21:53:57 +0100 |
|---|---|---|
| committer | Mike Vink <mike1994vink@gmail.com> | 2023-03-03 21:53:57 +0100 |
| commit | 035be9b1895133e0ffd1afdcc3a59c5d84c4b8d8 (patch) | |
| tree | e1fa4a22db691f145b14ee6a3c8e49063ecae2bf | |
| parent | 0988f106514e61b59f53e7fe3c599e03edcfd47c (diff) | |
fixup
| -rw-r--r-- | coding-exercises/1/27.rkt | 2 | ||||
| -rw-r--r-- | coding-exercises/1/28.rkt | 4 | ||||
| -rw-r--r-- | coding-exercises/1/30.rkt | 10 | ||||
| -rw-r--r-- | coding-exercises/1/31.rkt | 31 | ||||
| -rw-r--r-- | coding-exercises/1/32.rkt | 38 | ||||
| -rw-r--r-- | coding-exercises/1/33.rkt | 45 | ||||
| -rw-r--r-- | coding-exercises/1/34.rkt | 8 | ||||
| -rw-r--r-- | coding-exercises/1/35.rkt | 20 | ||||
| -rw-r--r-- | coding-exercises/1/36.rkt | 39 | ||||
| -rw-r--r-- | coding-exercises/1/37.rkt | 26 | ||||
| -rw-r--r-- | coding-exercises/1/38.rkt | 22 | ||||
| -rw-r--r-- | coding-exercises/1/39.rkt | 28 |
12 files changed, 270 insertions, 3 deletions
diff --git a/coding-exercises/1/27.rkt b/coding-exercises/1/27.rkt index 8762d6c..5a7a8d7 100644 --- a/coding-exercises/1/27.rkt +++ b/coding-exercises/1/27.rkt @@ -5,7 +5,7 @@ (* x x)) (define (expmod base e m) - (cond + (cond ((= e 0) 1) ((even? e) (remainder (square (expmod base (/ e 2) m)) m)) diff --git a/coding-exercises/1/28.rkt b/coding-exercises/1/28.rkt index 39a10d9..4e984fb 100644 --- a/coding-exercises/1/28.rkt +++ b/coding-exercises/1/28.rkt @@ -12,7 +12,7 @@ (else x))) ;; no root found (define (expmod base e m) - (cond + (cond ((= e 0) 1) ((even? e) (signal base e m (remainder (square (expmod base (/ e 2) m)) m))) @@ -30,4 +30,4 @@ (else false))) (f n n)) -(all-mr 1) +(all-mr 5) diff --git a/coding-exercises/1/30.rkt b/coding-exercises/1/30.rkt index c9bf57d..09b354e 100644 --- a/coding-exercises/1/30.rkt +++ b/coding-exercises/1/30.rkt @@ -1,4 +1,14 @@ #lang racket (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) diff --git a/coding-exercises/1/31.rkt b/coding-exercises/1/31.rkt new file mode 100644 index 0000000..10f52c5 --- /dev/null +++ b/coding-exercises/1/31.rkt @@ -0,0 +1,31 @@ +#lang racket +(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)) + +(define (pi-product n) + (/ (product (lambda (x) + (if (even? x) + x + (+ x 1))) + 2 inc n) + (product (lambda (x) + (if (even? x) + (+ x 1) + x)) + 2 inc n))) + +(* 1.0 (pi-product 1000)) diff --git a/coding-exercises/1/32.rkt b/coding-exercises/1/32.rkt new file mode 100644 index 0000000..21a557c --- /dev/null +++ b/coding-exercises/1/32.rkt @@ -0,0 +1,38 @@ +#lang racket + +(define (accumulate combiner null-value term a next b) + (define (iter a result) + (if (> a b) + result + (iter + (next a) + (combiner + (term a) + result)))) + (iter null-value a)) + +(define (accumulate combiner null-value term a next b) + (if (> a b) + null-value + (combiner + (term a) + (accumulate + combiner + null-value + term (next a) next b)))) + + +(define (sum term a next b) + (accumulate + (lambda (x y) (+ x y)) + 0 + term a next b)) + +(define (product term a next b) + (accumulate + (lambda (x y) (* x y)) + 1 + term a next b)) + +(sum id 0 inc 8) +(product id 1 inc 3) diff --git a/coding-exercises/1/33.rkt b/coding-exercises/1/33.rkt new file mode 100644 index 0000000..ff82408 --- /dev/null +++ b/coding-exercises/1/33.rkt @@ -0,0 +1,45 @@ +#lang racket +;; import miller raban prime test +(load "coding-exercises/1/28.rkt") + +;; 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)) + +(define (square-prime-sum a b) + (filtered-accumulate + prime? + (lambda (x y) (+ x y)) + 0 + (lambda (x) (* x x)) + a inc b)) + +(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? + (lambda (x y) (* x y)) + 1 + (lambda (x) x) + 1 inc (- n 1))) + +(coprime-product 10) diff --git a/coding-exercises/1/34.rkt b/coding-exercises/1/34.rkt new file mode 100644 index 0000000..e003817 --- /dev/null +++ b/coding-exercises/1/34.rkt @@ -0,0 +1,8 @@ +#lang racket + +(define (f g) + (g 2)) + +(f f) + + diff --git a/coding-exercises/1/35.rkt b/coding-exercises/1/35.rkt new file mode 100644 index 0000000..2f597c7 --- /dev/null +++ b/coding-exercises/1/35.rkt @@ -0,0 +1,20 @@ +#lang racket +(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 new file mode 100644 index 0000000..a785d8a --- /dev/null +++ b/coding-exercises/1/36.rkt @@ -0,0 +1,39 @@ +#lang racket +(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)) + +(define (log1000) + (fixed-point + (lambda (guess next) + next) + (lambda (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))) + 2.0)) + +(log1000) +(println " *** second time") +(log1000-average-damped) diff --git a/coding-exercises/1/37.rkt b/coding-exercises/1/37.rkt new file mode 100644 index 0000000..6ab3150 --- /dev/null +++ b/coding-exercises/1/37.rkt @@ -0,0 +1,26 @@ +#lang racket +(require sicp) + +;; recurse down +(define (cont-frac n d k) + (define (recurse i) + (if (> i k) + 0 + (/ (n i) (+ (d i) (recurse (inc i)))))) + (recurse 1)) + +;; iter up +(define (cont-frac n d k) + (define (iter result i) + (if (= i 0) + result + (iter + (/ (n i) (+ (d i) result)) + (dec i)))) + (iter 0 k)) + +;; test +(cont-frac + (lambda (i) 1.0) + (lambda (i) 1.0) + 11.0) diff --git a/coding-exercises/1/38.rkt b/coding-exercises/1/38.rkt new file mode 100644 index 0000000..5e78719 --- /dev/null +++ b/coding-exercises/1/38.rkt @@ -0,0 +1,22 @@ +#lang racket +(require sicp) + +;; recurse down +(define (cont-frac n d k) + (define (recurse i) + (if (> i k) + 0 + (/ (n i) (+ (d i) (recurse (inc i)))))) + (recurse 1)) + +(define (euler-d i) + (let ((next3 (+ i 1))) + (if (= 0 (remainder next3 3)) + (* 2 (/ next3 3)) + 1))) + +;; test +(+ 2 (cont-frac + (lambda (i) 1.0) + euler-d + 16.0)) diff --git a/coding-exercises/1/39.rkt b/coding-exercises/1/39.rkt new file mode 100644 index 0000000..90f9908 --- /dev/null +++ b/coding-exercises/1/39.rkt @@ -0,0 +1,28 @@ +#lang racket +(require sicp) + +(define (odd? i) + (= 1 (remainder i 2))) + +;; iter up +(define (cont-frac n d k) + (define (iter result i) + (if (= i 0) + result + (iter + (/ (n i) (+ (d i) result)) + (dec i)))) + (iter 0 k)) + +;; test +(define (tan-cf x k) + (cont-frac + (lambda (i) + (cond + ((= i 1) x) + ((> i 1) (* -1 (* x x))) + (else (error "invalid argument to cont-frac")))) + (lambda (i) (- (* 2 i) 1)) + k)) + +(tan-cf 2.0 10) |
