FWIW: I've used the built in "memoize" and had not problem. You can
view my solution at http://bitbucket.org/tebeka/euler-clj/src/tip/14.clj

On Oct 6, 10:46 pm, Jarl Haggerty <fictivela...@gmail.com> wrote:
> Problem 14 on project Euler is to find the number under 1,000,000 that
> is the start of the longest Collatz sequence.  My solution is below,
> basically it uses a hash map to cache the lengths of collatz
> sequences.  But when I get to 113383 the collatz function just bounces
> between the numbers 1, 2, and 4.  Those numbers seem to be in the map
> but contains? just keeps returning false.
>
> (ns euler.problem14)
>
> (def lengths (atom {1 0}))
>
> (defn collatz [input]
>   (loop [current input accum 0]
>     (when (= input 113383) (println current accum (filter #(< % 10)
> (keys @lengths))))
>     (if (contains? @lengths current)
>       (do
>         (swap! lengths #(assoc % input (+ accum (get % current))))
>         (get @lengths input))
>       (if (zero? (mod current 2))
>         (recur (/ current 2) (inc accum))
>         (recur (inc (* 3 current)) (inc accum))))))
>
> (time (println (last (sort-by #(second %) (for [x (range 1 1000000)]
> (do (println x) [x (collatz x)]))))))

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to