Compare commits

..

2 Commits

Author SHA1 Message Date
Folkert Kevelam
605eae2a5d Add Initial solutions 2025-05-29 22:00:25 +02:00
Folkert Kevelam
1ec43adeee Test some more versions 2025-05-29 21:59:23 +02:00
23 changed files with 920 additions and 2 deletions

View File

@ -102,11 +102,11 @@
(cc amount (- kind-of-coins 1) name)
(cc (- amount (first-denomination kind-of-coins)) kind-of-coins name))))
(def result (cc amount denom "test"))
(def result (cc amount denom "start"))
(dot/write graph "exercise_1_14.gv")
result)
(print (count-change2 11 2))
(print (count-change2 51 5))
# Using the graph we can find the following relation for (cc n 1)
# f(0,1) = 1

41
SICP/exercise_1_15.janet Normal file
View File

@ -0,0 +1,41 @@
(defn cube [x]
(* x x x))
(defn p [x]
(-
(* 3 x)
(* 4 (cube x))))
(defn sine [angle]
(if (not (> (math/abs angle) 0.1))
angle
(p (sine (/ angle 3.0)))))
(import ./dot :as dot)
(defn add-to [graph counter angle parent]
(def label (string/format "(sine %f)" angle))
(def node_name (string/format "node_%d" counter))
(def clr
(cond (> angle 0.1) "lightgray"
"lightgreen"))
(dot/add-node graph node_name :label label :shape "box" :fillcolor clr :style "filled")
(dot/add-relation graph parent node_name)
node_name)
(defn sine2 [angle]
(def graph (dot/create "angle" :graph_type :digraph))
(var counter 0)
(defn sin [angle parent]
(def name (add-to graph counter angle parent))
(set counter (+ counter 1))
(if (not (> (math/abs angle) 0.1))
angle
(p (sin (/ angle 3.0) name))))
(def result (sin angle "start"))
(dot/write graph "exercise_1_15.gv")
result)
(print (sine2 12.15))

83
SICP/exercise_1_16.janet Normal file
View File

@ -0,0 +1,83 @@
(defn expt [b n]
(if (= n 0)
1
(* b (expt b (- n 1)))))
(defn expt2 [b n]
(defn expt-iter [b n s]
(if (= n 0)
s
(expt-iter b (- n 1) (* s b))))
(expt-iter b n 1))
(defn fast-expt [b n]
(defn even? [n]
(= (mod n 2) 0))
(defn square [n]
(* n n))
(defn expt-iter [b n s]
(cond
(= n 0) s
(even? n) (square (expt-iter b (/ n 2) s))
(* b (expt-iter b (- n 1) s))))
(expt-iter b n 1))
(defn fast-expt2 [b n]
(defn even? [n]
(= (mod n 2) 0))
(defn square [n]
(* n n))
(defn expt-iter [b n s]
(cond
(= n 0) s
(even? n) (expt-iter (square b) (/ n 2) s)
(expt-iter b (- n 1) (* b s))))
(expt-iter b n 1))
(defn count-fast-expt2 [b n]
(var counter 0)
(defn even? [n]
(= (mod n 2) 0))
(defn square [n]
(* n n))
(defn expt-iter [b n s]
(set counter (+ counter 1))
(cond
(= n 0) s
(even? n) (expt-iter (square b) (/ n 2) s)
(expt-iter b (- n 1) (* b s))))
(expt-iter b n 1)
counter)
# case 1 (n mod 2 = 0):
# f(b,n) = f(b,n/2)^2
# case 2 (n mod 2 = 1):
# f(b,n) = f(b,n-1)*b
# iterative approach:
# case 1 (n mod 2 = 0):
# f(b,n) = f(b^2, n/2)
# case 2 (n mod 2 = 1):
# f(b,n) = f(b, n-1)*b
# examples:
# n = 1
# f(b,1) = f(b,0)*b = 1 * b = b
# n = 2
# f(b,2) = f(b^2,1) = 1 * b^2 = b^2
# n = 3
# f(b,3) = f(b,2)*b = f(b^2, 1) * b = b * b^2 = b^3
# n = 4
# f(b,4) = f(b^2,2) = f(b^4, 1) = 1 * b^4 = b^4
# n = 5
# f(b,5) = f(b,4)*b = f(b^4, 1) = b * b^5 = b^5
(def k 100000)
(defn lo [n]
(cond
(= n k) (printf "%d,%d" n (count-fast-expt2 0.99 n))
(do
(printf "%d,%d" n (count-fast-expt2 0.99 n))
(lo (+ n 1)))))
(lo 0)

48
SICP/exercise_1_17.janet Normal file
View File

@ -0,0 +1,48 @@
(defn mul [a b]
(if (= b 0)
0
(+ a (mul a (- b 1)))))
(defn fast-mul [a b]
(defn even? [n]
(= (mod n 2) 0))
(defn double [n]
(* n 2))
(defn halve [n]
(/ n 2))
(defn mul-iter [a b]
(cond
(= b 0) 0
(= b 1) a
(even? b) (double (mul-iter a (halve b)))
(+ a (mul-iter a (- b 1)))))
(mul-iter a b))
# Similar to exercise 1.16 the procedure is again split into two cases:
# case 1: b even?
# f(a,b) = f(2a,b/2)
# case 2: b uneven?
# f(a,b) = a+f(a,b-1)
# given:
# f(a,0) = 0
# f(a,1) = a
# f(a,2) = 2a
# f(a,n) = na
# prove (for n > 1):
# f(a, 2*n) = f(2a, n)
# f(a, 2*n-1) = a + f(a,2*n-2)
# solution:
# 2*n*a = 2*a*n
# (2*n - 1) * a = a + (2*n - 2)*a
# 2*n*a - a = a + 2*n*a - 2a
# 2*n*a - a = 2*n*a - a
(def k 100)
(defn lo [n]
(cond
(= n k) (printf "%d %f" n (fast-mul 10 n))
(do
(printf "%d %f" n (fast-mul 10 n))
(lo (+ n 1)))))
(lo 0)

82
SICP/exercise_1_18.janet Normal file
View File

@ -0,0 +1,82 @@
(defn mul [a b]
(if (= b 0)
0
(+ a (mul a (- b 1)))))
(defn fast-mul [a b]
(defn even? [n]
(= (mod n 2) 0))
(defn double [n]
(* n 2))
(defn halve [n]
(/ n 2))
(defn mul-iter [a b s]
(cond
(= b 0) s
(even? b) (mul-iter (double a) (halve b) s)
(mul-iter a (- b 1) (+ a s))))
(mul-iter a b 0))
(defn fast-mul2 [a b]
(defn even? [n]
(= (mod n 2) 0))
(defn double [n]
(* n 2))
(defn halve [n]
(/ n 2))
(defn mul-iter [a b s]
(cond
(= b 0) s
(= a 0) s
(even? b) (mul-iter (double a) (halve b) s)
(mul-iter (double a) (halve (- b 1)) (+ s a))))
(mul-iter a b 0))
# Similar to exercise 1.16 the procedure is again split into two cases:
# case 1: b even?
# f(a,b) = f(2a,b/2)
# case 2: b uneven?
# f(a,b) = a+f(a,b-1)
# given:
# f(a,0) = 0
# f(a,1) = a
# f(a,2) = 2a
# f(a,n) = na
# prove (for n > 1):
# f(a, 2*n) = f(2a, n)
# f(a, 2*n-1) = a + f(a,2*n-2)
# solution:
# 2*n*a = 2*a*n
# (2*n - 1) * a = a + (2*n - 2)*a
# 2*n*a - a = a + 2*n*a - 2a
# 2*n*a - a = 2*n*a - a
(def k 100)
(defn lo [n]
(cond
(= n k) (printf "%d %f" n (fast-mul 10 n))
(do
(printf "%d %f" n (fast-mul 10 n))
(lo (+ n 1)))))
(lo 0)
(def k 100)
(defn lo2 [n]
(cond
(= n k) (printf "%d %f" n (fast-mul2 10 n))
(do
(printf "%d %f" n (fast-mul2 10 n))
(lo2 (+ n 1)))))
(lo2 0)
(def k 100)
(defn lo3 [n]
(cond
(= n k) (printf "%d %f" n (fast-mul2 n 10))
(do
(printf "%d %f" n (fast-mul2 n 10))
(lo3 (+ n 1)))))
(lo3 0)

64
SICP/exercise_1_19.janet Normal file
View File

@ -0,0 +1,64 @@
(defn fib [n]
(defn fib-iter [n a b]
(cond
(= n 0) b
(fib-iter (- n 1) (+ a b) a)))
(fib-iter n 1 0))
(defn fib-fast [n]
(defn even? [n]
(= (mod n 2) 0))
(defn square [n]
(* n n))
(defn fib-iter [a b p q n]
(cond
(= n 0) b
(even? n)
(fib-iter
a b
(+ (square p) (square q))
(+ (* 2 p q) (square q))
(/ n 2))
(fib-iter
(+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p q (- n 1))))
(fib-iter 1 0 0 1 n))
(defn count-fib [n]
(var c 0)
(defn fib-iter [n a b]
(set c (+ c 1))
(cond
(= n 0) b
(fib-iter (- n 1) (+ a b) a)))
(fib-iter n 1 0)
c)
(defn count-fib-fast [n]
(defn even? [n]
(= (mod n 2) 0))
(defn square [n]
(* n n))
(var c 0)
(defn fib-iter [a b p q n]
(set c (+ 1 c))
(cond
(= n 0) b
(even? n)
(fib-iter
a b
(+ (square p) (square q))
(+ (* 2 p q) (square q))
(/ n 2))
(fib-iter
(+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p q (- n 1))))
(fib-iter 1 0 0 1 n)
c)
(var k 0)
(while (< k 100000)
(printf "%d,%d,%d" (+ k 1) (count-fib k) (count-fib-fast k))
(set k (+ k 1)))

15
SICP/exercise_1_21.janet Normal file
View File

@ -0,0 +1,15 @@
(defn smallest-divisor [n]
(defn square [n]
(* n n))
(defn divides? [a b]
(= (mod b a) 0))
(defn iter [n test]
(cond
(> (square test) n) n
(divides? test n) test
(iter n (+ test 1))))
(iter n 2))
(trace (smallest-divisor 199))
(print (smallest-divisor 1999))
(print (smallest-divisor 19999))

43
SICP/exercise_1_22.janet Normal file
View File

@ -0,0 +1,43 @@
(defn square [n]
(* n n))
(defn divides? [a b]
(= (mod b a) 0))
(defn smallest-divisor [n]
(defn iter [n test]
(cond
(> (square test) n) n
(divides? test n) test
(iter n (+ test 1))))
(iter n 2))
(defn prime? [n]
(= n (smallest-divisor n)))
(defn search-for-primes [start count]
(defn report-time [n elapsed-time]
(printf "%d *** %fus" n (* elapsed-time 1000000.0)))
(defn start-prime-test [n start-time]
(if (prime? n)
(do
(report-time n (- (os/clock :cputime) start-time))
true)
false))
(defn times-prime-test [n]
(start-prime-test n (os/clock :cputime)))
(defn iter [test n]
(cond
(= n 0) 0
(times-prime-test test) (iter (+ test 2) (- n 1))
(iter (+ test 2) n)))
(cond
(= 0 (mod start 2)) (iter (+ start 1) count)
(iter start count)))
(search-for-primes 1000 3)
(search-for-primes 10000 3)
(search-for-primes 100000 3)
(search-for-primes 1000000 3)
(search-for-primes 10000000 3)
(search-for-primes 100000000 3)

62
SICP/exercise_1_23.janet Normal file
View File

@ -0,0 +1,62 @@
(defn square [n]
(* n n))
(defn divides? [a b]
(= (mod b a) 0))
(defn next [n]
(cond
(= n 2) 3
(+ n 2)))
(defn smallest-divisor [n]
(defn iter [n test]
(cond
(> (square test) n) n
(divides? test n) test
(iter n (+ test 1))))
(iter n 2))
(defn prime? [n]
(= n (smallest-divisor n)))
(defn smallest-divisor2 [n]
(defn iter [n test]
(cond
(> (square test) n) n
(divides? test n) test
(iter n (next test))))
(iter n 2))
(defn prime2? [n]
(= n (smallest-divisor2 n)))
(defn search-for-primes [start count]
(defn report-time [n elapsed-time1 elapsed-time2]
(printf "%d,%f,%f" n (* elapsed-time1 1000000.0) (* elapsed-time2 1000000.0)))
(defn start-prime-test [n start-time]
(def a (prime? n))
(def end-time-1 (os/clock :cputime))
(def elapsed (- end-time-1 start-time))
(def b (prime2? n))
(def elapsed2 (- (os/clock :cputime) end-time-1))
(if (and a b)
(do
(report-time n elapsed elapsed2)
true)
false))
(defn times-prime-test [n]
(start-prime-test n (os/clock :cputime)))
(defn iter [test n]
(cond
(= n 0) 0
(times-prime-test test) (iter (+ test 2) (- n 1))
(iter (+ test 2) n)))
(cond
(= 0 (mod start 2)) (iter (+ start 1) count)
(iter start count)))
(search-for-primes 1000 100000)
#(search-for-primes 10000 3)
#(search-for-primes 100000 3)
#(search-for-primes 1000000 3)

61
SICP/exercise_1_24.janet Normal file
View File

@ -0,0 +1,61 @@
(defn random [n]
(math/floor (* n (math/random))))
(defn square [n]
(* n n))
(defn divides? [a b]
(= (mod b a) 0))
(defn expmod [base exp m]
(cond
(= exp 0) 1
(even? exp) (mod (square (expmod base (/ exp 2) m)) m)
(mod (* base (expmod base (- exp 1) m)) m)))
(defn fast-expt [b n]
(defn expt-iter [b n s]
(cond
(= n 0) s
(even? n) (square (expt-iter b (/ n 2) s))
(* b (expt-iter b (- n 1) s))))
(expt-iter b n 1))
(defn expmod-n [base exp m]
(mod (fast-expt base exp) m))
(print (expmod 10 11 11))
(print (expmod-n 10 11 11))
(defn fermat-test [n]
(defn try-it [a]
(= (expmod a n n) a))
(try-it (+ 1 (random (- n 1)))))
(defn fast-prime? [n times]
(cond
(= times 0) true
(fermat-test n) (fast-prime? n (- times 1))
false))
(defn search-for-primes [start count]
(defn report-time [n elapsed-time]
(printf "%d,%f" n (* elapsed-time 1000000.0)))
(defn start-prime-test [n start-time]
(if (fast-prime? n 7)
(do
(report-time n (- (os/clock :cputime) start-time))
true)
false))
(defn times-prime-test [n]
(start-prime-test n (os/clock :cputime)))
(defn iter [test n]
(cond
(= n 0) 0
(times-prime-test test) (iter (+ test 2) (- n 1))
(iter (+ test 2) n)))
(cond
(= 0 (mod start 2)) (iter (+ start 1) count)
(iter start count)))
#(search-for-primes 1000 1000000)

29
SICP/exercise_1_26.janet Normal file
View File

@ -0,0 +1,29 @@
(defn random [n]
(math/floor (* n (math/random))))
(defn square [n]
(* n n))
(defn divides? [a b]
(= (mod b a) 0))
(defn expmod [base exp m]
(cond
(= exp 0) 1
(even? exp) (mod (square (expmod base (/ exp 2) m)) m)
(mod (* base (expmod base (- exp 1) m)) m)))
(defn fermat-test [n]
(defn iter [a]
(cond
(= a 0) true
(= (expmod a n n) a) (iter (- a 1))
false))
(iter (- n 1)))
(print (fermat-test 561))
(print (fermat-test 1105))
(print (fermat-test 1729))
(print (fermat-test 2465))
(print (fermat-test 2821))
(print (fermat-test 6601))

48
SICP/exercise_1_28.janet Normal file
View File

@ -0,0 +1,48 @@
(defn square [n]
(* n n))
(defn even? [n]
(= (mod n 2) 0))
(defn expmod [base exp m]
(defn squaring-test [k]
(cond
(and
(not (= k 1))
(not (= k (- m 1)))
(= (mod (square k) m) 1)) 0
(mod (square k) m)))
(cond
(= exp 0) 1
(even? exp) (squaring-test (expmod base (/ exp 2) m))
(mod (* base (expmod base (- exp 1) m)) m)))
(defn miller-rabin-test [n]
(defn random [n]
(math/floor (* (math/random) n)))
(defn try-it [a]
(def test (expmod a (- n 1) n))
(cond
(= test 0) false
true))
(try-it (+ 1 (random (- n 1)))))
(defn prime? [n times]
(cond
(= times 0) true
(miller-rabin-test n) (prime? n (- times 1))
false))
(print "Should be true")
(print (prime? 11 100))
(print (prime? 13 100))
(print (prime? 5 100))
(print "Should be false")
(print (prime? 561 100))
(print (prime? 1105 100))
(print (prime? 1729 100))
(print (prime? 2465 100))
(print (prime? 2821 100))
(print (prime? 6601 100))

44
SICP/exercise_1_29.janet Normal file
View File

@ -0,0 +1,44 @@
(defn cube [n]
(+ (* 5 n n n) (math/sin (* 2.5 n))))
(defn sum [term next a b]
(if (> a b)
0
(+ (term a)
(sum term next (next a) b))))
(defn integral-old [f a b dx]
(defn add-dx [x]
(+ x dx))
(* (sum f add-dx (+ a (/ dx 2.0)) b) dx))
(defn integral [f a b n]
(def h (/ (- b a) n))
(defn incre [n]
(+ n 1))
(defn apply [k]
(def multiplier
(cond
(or (= k 0) (= k n)) 1
(= (mod k 2) 0) 2
4))
(* multiplier (f (+ a (* k h)))))
(* (/ h 3) (sum apply incre 0 n)))
(defn integral-improved [f a b n]
(def h (/ (- b a) n))
(defn incre [k]
(+ k 2))
(defn apply [k]
(f (+ a (* k h))))
(* (/ h 3)
(+
(f a)
(* 4 (sum apply incre 1 (- n 1)))
(* 2 (sum apply incre 2 (- n 1)))
(f b))))
(printf "%.23f" (integral-improved cube 0 1 10))
(printf "%.23f" (integral-improved cube 0 1 100))
(printf "%.23f" (integral-improved cube 0 1 1000))
(printf "%.23f" (integral-improved cube 0 1 10000))

49
SICP/exercise_1_30.janet Normal file
View File

@ -0,0 +1,49 @@
(defn sum-recur [term next a b]
(if (> a b)
0
(+ (term a)
(sum-recur term next (next a) b))))
(defn sum-iter [term next a b]
(defn iter [a result]
(if (> a b)
result
(iter (next a) (+ result (term a)))))
(iter a 0))
(defn cube [n]
(* n n n))
(defn inc [n]
(+ n 1))
(defn simpsons-recur [f a b n]
(def h (/ (- b a) n))
(defn fapply [k]
(f (+ a (* k h))))
(defn add-two [k]
(+ k 2))
(* (/ h 3)
(+
(f a)
(f b)
(* 4 (sum-recur fapply add-two 1 n))
(* 2 (sum-recur fapply add-two 2 (- n 1))))))
(defn simpsons-iter [f a b n]
(def h (/ (- b a) n))
(defn fapply [k]
(f (+ a (* k h))))
(defn add-two [k]
(+ k 2))
(* (/ h 3)
(+
(f a)
(f b)
(* 4 (sum-iter fapply add-two 1 n))
(* 2 (sum-iter fapply add-two 2 (- n 1))))))
(print (sum-recur cube inc 1 10))
(print (sum-iter cube inc 1 10))
(print (simpsons-recur cube 0 1 100))
(print (simpsons-iter cube 0 1 100))

46
SICP/exercise_1_31.janet Normal file
View File

@ -0,0 +1,46 @@
(defn product-iter [term next a b]
(defn iter [a result]
(if (> a b)
result
(iter (next a) (* result (term a)))))
(iter a 1))
(defn product-recur [term next a b]
(if (> a b)
1
(* (term a)
(product-recur term next (next a) b))))
(defn identity [n] n)
(defn inc [n] (+ n 1))
(defn factorial-iter [a b]
(product-iter identity inc a b))
(defn factorial-recur [a b]
(product-recur identity inc a b))
(defn pi [n]
(defn next [k]
(+ k 1))
(defn even-term [k]
(cond
(= (mod k 2) 0) (+ 2 k)
(+ 2 (- k 1))))
(defn odd-term [k]
(cond
(= (mod k 2) 0) (+ 3 k)
(+ 3 (- k 1))))
(* 4
(/
(product-iter even-term next 1 n)
(product-iter odd-term next 0 (- n 1)))))
(var x 1)
(while (< x 20)
(print (factorial-iter 1 x))
(print (factorial-recur 1 x))
(print "")
(print (pi x))
(print "")
(set x (+ x 1)))

32
SICP/exercise_1_32.janet Normal file
View File

@ -0,0 +1,32 @@
(defn accumulate-iter [comb null-val term next a b]
(defn iter [a result]
(if (> a b)
result
(iter (next a) (comb (term a) result))))
(iter a null-val))
(defn accumulate-recur [comb null-val term next a b]
(if (> a b)
null-val
(comb (term a)
(accumulate-recur comb null-val term next (next a) b))))
(defn add [a b]
(+ a b))
(defn mult [a b]
(* a b))
(defn id [n] n)
(defn inc [n] (+ n 1))
(defn sum [a b]
(accumulate-recur add 0 id inc a b))
(defn factorial [a b]
(accumulate-recur mult 1 id inc a b))
(var x 1)
(while (< x 10)
(printf "n=%d, sum 1-n: %d, factorial 1-n: %d" x (sum 1 x) (factorial 1 x))
(set x (+ x 1)))

64
SICP/exercise_1_33.janet Normal file
View File

@ -0,0 +1,64 @@
(defn filtered-accumulate [predicate comb null-val term next a b]
(defn iter [a result]
(if (> a b)
result
(iter (next a) (cond
(predicate a b) (comb (term a) result)
result))))
(iter a null-val))
(defn prime? [n x]
(defn random [k]
(math/floor (* (math/random) k)))
(defn square [k]
(* k k))
(defn even? [k]
(= (mod k 2) 0))
(defn expmod [base exp m]
(defn squaring-test [k]
(cond
(and
(not (= k 1))
(not (= k (- m 1)))
(= (mod (square k) m) 1)) 0
(mod (square k) m)))
(cond
(= exp 0) 1
(even? exp) (squaring-test (expmod base (/ exp 2) m))
(mod (* base (expmod base (- exp 1) m)) m)))
(defn miller-rabin-test [k]
(defn try-it [a]
(cond
(= (expmod a (- k 1) k) 0) false
true))
(try-it (+ 1 (random (- k 1)))))
(defn iter [k times]
(cond
(= times 0) true
(miller-rabin-test k) (iter k (- times 1))
false))
(iter n 100))
(defn rel-prime? [a b]
(defn gcd [x y]
(if (= y 0)
x
(gcd y (mod x y))))
(cond
(= (gcd a b) 1) true
false))
(defn prime-sum [a b]
(defn identity [n] n)
(defn next [n] (+ n 1))
(defn add [a b] (+ a b))
(filtered-accumulate prime? add 0 identity next a b))
(defn rel-prime-sum [n]
(defn identity [n] n)
(defn next [n] (+ n 1))
(defn mul [a b] (* a b))
(filtered-accumulate rel-prime? mul 1 identity next 1 n))
(print (prime-sum 2 5))
(print (rel-prime-sum 6))

8
SICP/exercise_1_34.janet Normal file
View File

@ -0,0 +1,8 @@
(defn f [g] (g 2))
(defn square [n]
(* n n))
(print (f square))
(print (f (fn [z] (* z (+ z 1)))))
(print (f f))

13
SICP/exercise_1_35.janet Normal file
View File

@ -0,0 +1,13 @@
(def tolerance 0.00001)
(defn fixed-point [f first-guess]
(defn close-enough? [v1 v2]
(< (math/abs (- v1 v2))
tolerance))
(defn try-it [guess]
(let [next (* 0.5 (+ guess (f guess)))]
(if (close-enough? guess next)
next
(try-it next))))
(try-it first-guess))
(print (fixed-point (fn [x] (+ 1 (/ 1 x))) 1.0))

28
SICP/exercise_1_36.janet Normal file
View File

@ -0,0 +1,28 @@
(def tolerance 0.00001)
(defn fixed-point [f damping first-guess]
(defn close-enough? [v1 v2]
(< (math/abs (- v1 v2))
tolerance))
(defn try-it [guess]
(printf "current guess %f" guess)
(let [next (damping guess (f guess))]
(if (close-enough? guess next)
next
(try-it next))))
(try-it first-guess))
(print "undamped")
(print (fixed-point
(fn [x] (/ (math/log 1000) (math/log x)))
(fn [x1 x2] x2)
2.0
)
)
(print "damped")
(print (fixed-point
(fn [x] (/ (math/log 1000) (math/log x)))
(fn [x1 x2] (* 0.5 (+ x1 x2)))
2.0
)
)

23
SICP/exercise_1_37.janet Normal file
View File

@ -0,0 +1,23 @@
(defn cont-frac [N D k]
(defn iter [i]
(cond
(= k i) (/ (N i) (D i))
(/ (N i) (+ (D i) (iter (+ i 1))))))
(iter 1))
(defn cont-frac-iter [N D k]
(defn iter [prev i]
(if (>= i k)
prev
(cond
(= i 1) (iter (/ (N (- k i)) (D (- k i))) (+ i 1))
(iter (/ (N (- k i)) (+ (D (- k i)) prev)) (+ i 1)))))
(iter 0 1))
(print (cont-frac (fn [i] 1.0)
(fn [i] 1.0)
12))
(print (cont-frac-iter (fn [i] 1.0)
(fn [i] 1.0)
12))

17
SICP/exercise_1_38.janet Normal file
View File

@ -0,0 +1,17 @@
(defn cont-frac [N D k]
(defn iter [prev i]
(if (>= i k)
prev
(cond
(= i 1) (iter (/ (N (- k i)) (D (- k i))) (+ i 1))
(iter (/ (N (- k i)) (+ (D (- k i)) prev)) (+ i 1)))))
(iter 0 1))
(defn identity [i] 1.0)
(defn D [i]
(let [n (+ i 1)]
(cond
(= (mod n 3) 0) (* (/ n 3) 2)
1.0)))
(print (+ 2 (cont-frac identity D 100)))

18
SICP/exercise_1_39.janet Normal file
View File

@ -0,0 +1,18 @@
(defn cont-frac [N D k]
(defn iter [prev i]
(if (>= i k)
prev
(cond
(= i 1) (iter (/ (N (- k i)) (D (- k i))) (+ i 1))
(iter (/ (N (- k i)) (- (D (- k i)) prev)) (+ i 1)))))
(iter 0 1))
(defn tan-cf [x k]
(defn odd [i] (- (* i 2) 1))
(defn N [i]
(cond
(= i 1) x
(* x x)))
(cont-frac N odd k))
(print (tan-cf 1 100))