Problem 65 continues our exploration of continued fractions, although this time a different property is the focus: the ability to generate rational fractions that converge on better and better approximations to the number e.
This problem was a rather straightforward to implement.
(defn as-digits [num] (map #(Character/getNumericValue %) (str num)))
(def continued-fraction-of-e (cons 2 (interleave (repeat 1)
(map #(* 2 (inc %)) (range))
(repeat 1))))
(defn convergents [coll]
(let [f (fn [[as h1 h2]] [(next as) (+ (* (first as) h1) h2) h1])
hs (rest (map second (iterate f [coll 1 0])))
ks (rest (map second (iterate f [coll 0 1])))]
(map / hs ks)))
(defn euler-65 []
(->> (nth (convergents continued-fraction-of-e) (dec 100))
(numerator)
(as-digits)
(reduce +)))
(time (euler-65)) ;; "Elapsed time: 5.171186 msecs"
Just for kicks, I used the -» operator in euler-65 to show the sequential nature of the last little calculation. Lately I have been thinking about how all my programs run inside out, so returning to a “list of operations” style of programming somehow feels a little novel.