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

Reply via email to