From fde4478f5900c2210cf662eacba93e9d797c2b17 Mon Sep 17 00:00:00 2001 From: Cosmin Stejerean Date: Sun, 12 Feb 2012 23:38:34 +1100 Subject: [PATCH] added exercises 1.15, 1.16, 1.17, 1.18 --- exercise-1-15.ss | 19 +++++++++++++++++++ exercise-1-16.ss | 21 +++++++++++++++++++++ exercise-1-17.ss | 19 +++++++++++++++++++ exercise-1-18.ss | 18 ++++++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 exercise-1-15.ss create mode 100644 exercise-1-16.ss create mode 100644 exercise-1-17.ss create mode 100644 exercise-1-18.ss diff --git a/exercise-1-15.ss b/exercise-1-15.ss new file mode 100644 index 0000000..a032b35 --- /dev/null +++ b/exercise-1-15.ss @@ -0,0 +1,19 @@ +(define (cube x) (* x x x)) + +(define (p x) + (pretty-print 1) + (- (* 3 x) (* 4 (cube x)))) + +(define (sine angle) + (if (not (> (abs angle) 0.1)) + angle + (p (sine (/ angle 3.0))))) + + +;; each time we divide the angle by 3 until the angle is <= 0.1 +;; +;; 12.15 => 4.05 => 1.35 => 0.45 => 0.15 => 0.05 +;; +;; therefore we call p 5 times to compute sine of 12.15 + +;; both the space and complexity of this operation is log(n) (base 3) diff --git a/exercise-1-16.ss b/exercise-1-16.ss new file mode 100644 index 0000000..aeb8ae9 --- /dev/null +++ b/exercise-1-16.ss @@ -0,0 +1,21 @@ +(define (square x) (* x x)) + +(define (even? n) (= (remainder n 2) 0)) + +;; linear recursive algorithm + +(define (fast-expt b n) + (cond ((= n 0) 1) + ((even? n) (square (fast-expt b (/ n 2)))) + (else (* b (fast-expt b (- n 1)))))) + + +;; iterative algorithm + +(define (expt b n) + (fast-expt-iter b n 1)) + +(define (fast-expt-iter b n a) + (cond ((= n 0) a) + ((even? n) (fast-expt-iter (square b) (/ n 2) a)) + (else (fast-expt-iter b (- n 1) (* b a))))) diff --git a/exercise-1-17.ss b/exercise-1-17.ss new file mode 100644 index 0000000..8f1a51d --- /dev/null +++ b/exercise-1-17.ss @@ -0,0 +1,19 @@ +(define (mul a b) + (if (= b 0) + 0 + (+ a (mul a (- b 1))))) + +;; pretend the following are built-in + +(define (double a) (* a 2)) + +(define (halve a) (/ a 2)) + +(define (even? n) (= (remainder n 2) 0)) + +;; fast-multiplication -- log(n) steps + +(define (fast-mul a b) + (cond ((= b 0) 0) + ((even? b) (fast-mul (double a) (halve b))) + (else (+ a (fast-mul a (- b 1)))))) diff --git a/exercise-1-18.ss b/exercise-1-18.ss new file mode 100644 index 0000000..23ef03d --- /dev/null +++ b/exercise-1-18.ss @@ -0,0 +1,18 @@ +;; pretend built-ins + +(define (double a) (* a 2)) + +(define (halve a) (/ a 2)) + +(define (even? n) (= (remainder n 2) 0)) + + +;; iterative fast-mul + +(define (mul a b) + (fast-mul-iter a b 0)) + +(define (fast-mul-iter a b acc) + (cond ((= b 0) acc) + ((even? b) (fast-mul-iter (double a) (halve b) acc)) + (else (fast-mul-iter a (- b 1) (+ acc a)))))