summaryrefslogtreecommitdiff
path: root/coding-exercises/1
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2023-03-03 21:53:57 +0100
committerMike Vink <mike1994vink@gmail.com>2023-03-03 21:53:57 +0100
commit035be9b1895133e0ffd1afdcc3a59c5d84c4b8d8 (patch)
treee1fa4a22db691f145b14ee6a3c8e49063ecae2bf /coding-exercises/1
parent0988f106514e61b59f53e7fe3c599e03edcfd47c (diff)
fixup
Diffstat (limited to 'coding-exercises/1')
-rw-r--r--coding-exercises/1/27.rkt2
-rw-r--r--coding-exercises/1/28.rkt4
-rw-r--r--coding-exercises/1/30.rkt10
-rw-r--r--coding-exercises/1/31.rkt31
-rw-r--r--coding-exercises/1/32.rkt38
-rw-r--r--coding-exercises/1/33.rkt45
-rw-r--r--coding-exercises/1/34.rkt8
-rw-r--r--coding-exercises/1/35.rkt20
-rw-r--r--coding-exercises/1/36.rkt39
-rw-r--r--coding-exercises/1/37.rkt26
-rw-r--r--coding-exercises/1/38.rkt22
-rw-r--r--coding-exercises/1/39.rkt28
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)