I implemented the "Flavius Josephus" algorithm from Programming Praxis
in Clojure using loop/recur. My first version looked like this:

(defn rotate-left
  ([ln n m]
     (take n (drop (dec m) (cycle ln))))
  ([ln m] (rotate-left ln (count ln) m)))

(defn josephus3 [N M] ;; execute every mth soldier
  (loop [soldiers (range N)
         m M
         deceased '()]
    (let [n (count soldiers)]
      (cond
     (zero? n) deceased
     true (let [r (rotate-left soldiers n m)
                dead (cons (first r) deceased)
                survivors (rest r)]
            (recur survivors m dead))))))

This works fine, but I don't really need to count the soldiers every
pass, it always decreases by 1. So I wrote this version in which n is
one of the loop parameters:

(defn josephus4 [N M] ;; execute every mth soldier
  (loop [soldiers (range N)
         n N
         m M
         deceased '()]
    (cond
     (zero? n) deceased
     true (let [r (rotate-left soldiers n m)
                dead (cons (first r) deceased)
                survivors (rest r)]
            (recur survivors (dec n)  m dead)))))

Both work for small N (e.g. 41) but the second one fails for large
(41000) N with a stack overflow.
What am I missing here?

Thanks,
Charles

-- 
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