On Jul 9, 8:58 am, Christian Marks <9fv...@gmail.com> wrote:
> The clojure code below applies the constant space algorithm ... of C. J. Gower
...  to the computation of the order of a permutation [Knuth, D. E.,
“Selected Papers on Analysis of
> Algorithms,” CSLI Lecture Notes Number 102, CSLI Publications, (2000),p 4]
...
> I'm using recur, however some clojure programmers inform me that recur
> "should" be eliminated in favor of doseq or fold. I see nothing wrong
> with recur myself--am I missing
> something?
>


Not much. If you replace your

> (defn order-perm [perm]
>         (let [n (count perm)]
>                 (loop [i 0 order 1]
>                         (if (= i n)
>                                 order
>                             (recur (inc i)
>                                    (if (= i (next-cycle-leader perm i))
>                                                      (math/lcm (cycle-length 
> perm i) order)
>                               order))))))

with the more compact

(defn order-permo [perm]
             (reduce (fn [order i] (if (= i (next-cycle-leader perm i))
                                    (math/lcm (cycle-length perm i)
order)
                                     order))
                          1 perm))

you'll be rewarded with better performance with permutations of size
<= 100000,
and slightly worse performance with larger permutations:


knuth=> (load "knuth")
nil
knuth=> (ns knuth)
nil
knuth=> (def p (random-perm 100000))
#'knuth/p
knuth=> (time (order-perm p))
"Elapsed time: 958.706617 msecs"
8124696972786944584881000
knuth=> (time (order-permo p))
"Elapsed time: 908.262712 msecs"
8124696972786944584881000
knuth=> (def p (random-perm 1000000))
#'knuth/p
knuth=> (time (order-perm p))
"Elapsed time: 14699.019199 msecs"
121656328493888810917835084160
knuth=> (time (order-permo p))
"Elapsed time: 15338.770595 msecs"
121656328493888810917835084160
knuth=>

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