> > > (defn maximal-elements [f s]
> > > "Return a seq of elements of s maximizing (f elt)."
> > > (when (seq s)
> > > (loop [max-elts (first s),
> > > max-val (f (first s)),
> > > rest-elts (rest s)]
> > > (if (empty? rest-elts)
> > > max-elts
> > > (let [next-val (f (first rest-elts))]
> > > (cond (< next-val max-val) (recur max-elts max-val (rest rest-
> > > elts))
> > > (= next-val max-val) (recur (cons (first rest-elts)
> > > max-elts) max-
> > > val (rest rest-elts))
> > > (> next-val max-val) (recur [(first rest-elts)] next-val
> > > (rest rest-
> > > elts))))))))
>
> > I'm having a hard time imagining when maximal-elements would be
> > useful. What have you used it for? Looks like a good candidate for
> > application code. :-)
>
> I've used it for picking the best successors in a search algorithm,
> particularly as (first (maximal-elements ...)) or (random-element
> (maximal-elements ...)).
>
> But, I can imagine it would be useful in many situations, i.e. things
> like.
> user> (maximal-elements second {:bob 10 :lisa 20 :peter 20})
> ([:peter 20] [:lisa 20])
Oops, just found occasion to use this again and realized there's a bug
if the first element ends up being maximal. Here's a fixed version.
(defn maximal-elements [f s]
"Return a seq of elements of s maximizing (f elt)."
(when (seq s)
(loop [max-elts [(first s)],
max-val (f (first s)),
rest-elts (rest s)]
(if (empty? rest-elts)
max-elts
(let [next-val (f (first rest-elts))]
(cond (< next-val max-val) (recur max-elts max-val (rest rest-
elts))
(= next-val max-val) (recur (cons (first rest-elts) max-elts)
max-
val (rest rest-elts))
(> next-val max-val) (recur [(first rest-elts)] next-val (rest
rest-
elts))))))))
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---