]> git.rkrishnan.org Git - sicp.git/commitdiff
cleaner implementation making use of sum
authorRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Tue, 4 May 2010 10:56:04 +0000 (16:26 +0530)
committerRamakrishnan Muthukrishnan <vu3rdd@gmail.com>
Tue, 4 May 2010 10:56:04 +0000 (16:26 +0530)
src/sicp/ex1_29.clj

index cf30a23af12f7f78a6f7748acd2554429081a355..0f36ae5032e39858d19fc7c03c26d272a57279b7 100644 (file)
@@ -3,20 +3,23 @@
        [clojure.contrib trace test-is]))
 
 ;; simpson's rule of integration
-(defn make-fac [k n]
-  (cond (= k 0) 1
-       (= k n) 1
-       (even? k) 2
-       :else 4))
-
-(defn simpson-sum [term a next-fn b n k]
-  (let [fac (make-fac k n)]
-    (if (> k n)
-      0
-      (+ (* fac (term a))
-        (simpson-sum term (next-fn a) next-fn b n (+ k 1))))))
+(defn sum [term a next b]
+  (if (> a b)
+    0
+    (+ (term a)
+       (sum term (next a) next b))))
 
 (defn simpson-rule [f a b n]
-  (let [h (/ (- b a) n)]
-    (* (simpson-sum f a #(+ h %) b n 0)
-       (/ h 3.0))))
+  (let [h (/ (- b a) n)
+       make-fac (fn [k]
+                  (cond (= k 0) 1
+                        (= k n) 1
+                        (even? k) 2
+                        :else 4))
+       simp-term (fn [k]
+                   (* (make-fac k)
+                      (f (+ a (* k h)))))]
+    (* (/ h 3.0)
+       (sum simp-term 0 inc n))))
+
+;;; lots of great ideas in the above exercise.
\ No newline at end of file