(ns sicp.ex1_32 (:use [sicp utils] [clojure.contrib test-is])) (defn 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)))) (def sum (fn [a b] (accumulate + 0 identity a inc b))) (def sum-cube (fn [a b] (accumulate + 0 cube a inc b))) (def prod (fn [a b] (accumulate * 1 identity a inc b))) (defn iaccumulate [combiner null-value term a next b] (iter combiner null-value term a next b null-value)) (defn iter [combiner null-value term a next b result] (if (> a b) result (iter combiner null-value term (next a) next b (combiner (term a) result)))) (def isum (fn [a b] (iaccumulate + 0 identity a inc b))) (def isum-cube (fn [a b] (iaccumulate + 0 cube a inc b))) (def iprod (fn [a b] (iaccumulate * 1 identity a inc b))) (deftest test-sum-of-integers-from-1-to-10 (is (= (sum 1 10) (reduce + (range 1 11))))) (deftest test-sum-cube-of-integers-from-1-to-10 (is (= (sum-cube 1 10) (reduce + (map cube (range 1 11)))))) (deftest test-prod-of-ints-from-1-to-10 (is (= (prod 1 10) (reduce * (range 1 11))))) (deftest test-isum-of-integers-from-1-to-10 (is (= (isum 1 10) (reduce + (range 1 11))))) (deftest test-isum-cube-of-integers-from-1-to-10 (is (= (isum-cube 1 10) (reduce + (map cube (range 1 11)))))) (deftest test-iprod-of-ints-from-1-to-10 (is (= (iprod 1 10) (reduce * (range 1 11)))))