SICPの勉強 問題1.33
SICP1.3.1の問題1.33を解いてみる。
filtered-accumulateのiterative process版:
(defn filtered-accumulate [combiner null-value filt f a next b] (loop [a a result null-value] (cond (> a b) result (filt a) (recur (next a) (combiner (f a) result)) :else (recur (next a) result))))
(recursive process版は引数のあまりの多さ・複雑さがおぞましかったので飛ばす)
idiomatic clojure版:
(defn filtered-accumulate [combiner null-value filt f a next b] (->> (iterate next a) (take-while #(<= % b)) (filter filt) (map f) (reduce combiner null-value)))
sum-of-squares-of-primes:
(defn sosop [n] (filtered-accumulate + 0 prime? sq 2 inc n))
product-of-relatively-prime:
(defn porp [n] (filtered-accumulate * 1 #(= 1 (gcd n %)) identity 1 inc n))