This code looks it working: (defn prime-2? [num] (loop [i 2] (if (<= (* i i) num) (if (zero? (mod num i)) false (recur (inc i))) true)))
Any potential logic error? On Feb 17, 2:01 am, Marek Stępniowski <mstepniow...@gmail.com> wrote: > On Thu, Feb 17, 2011 at 12:34 AM, HB <hubaghd...@gmail.com> wrote: > > I'm trying to write a function that determines if a number is a prime > > or not. > > Here is my first shot: > > > (defn prime? [num] > > (loop [i 2] > > (if (<= (* i i) num) > > false) > > (recur (inc i))) > > true) > > > It is not working to be sure :) > > > Please blow my mind with various implementations. > > It seems that you're mixing loop expression in Clojure with a Java > loop. The loop in Clojure is just a binding and a point to which each > recur will jump, instead of the start of function. You're lacking a > stop condition in the loop. > > Here is the solution similiar to yours, but with a proper accumulator > and stop condition: > > (defn prime? [n] > (let [m (Math/sqrt n))] > (loop [k 2] > (cond > (> k m) true > (zero? (mod n k)) false > true (recur (inc k)))))) > > IMHO more idiomatic Clojure solution, using seq operations: > > (defn prime? [n] > (if (< n 2) > false > (not-any? #(zero? (rem n %)) > (range 2 (min (inc (Math/sqrt n)) n))))) > > Cheers, > -- > Marek Stępniowskihttp://stepniowski.com -- 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