Hi,
I'm just learning Clojure too, so I don't have much to add to what
everyone else has said, but here's my crack at a full implenentation
of merge-sort in Clojure. I'm sure that there is plenty of room for
improvement (especially wrt. the merge function) but in case it's
helpful, here it is:
(defn lazy-merge [seq1 seq2]
(cond (<= (count seq1) 0) (lazy-cons (first seq2) (rest seq2))
(<= (count seq2) 0) (lazy-cons (first seq1) (rest seq1))
:else (let [h1 (first seq1)
h2 (first seq2)]
(if (< h1 h2)
(lazy-cons h1 (lazy-merge (rest seq1) seq2))
(lazy-cons h2 (lazy-merge seq1 (rest seq2)))))))
(defn merge-sort [seq]
(if (> (count seq) 1)
(apply lazy-merge (map merge-sort (split-at (/ (count seq) 2)
seq)))
seq))
-
John
On Jan 10, 9:21 pm, e <[email protected]> wrote:
> I'm just trying to understand basic stuff.
> say I have a local list called "myList" (assigned using 'let' . . .
> should I have used something else?) Who cares what's in it. Maybe I
> set it up from a list comprehension from some input to my function.
>
> I have no idea how to iteratively mess with it since everything is
> persistent. Ok, like, say it's a list of lists and I am going to be
> merging the lists, like Tarjan's mergesort from some book from
> college.
>
> so I have myList with contents [[11] [2] [4] [1] [99]]
>
> here's how I would do it in python:
>
> def msort(myList):
> myList = [[x] for x in someList]
> while len(myList) > 1:
> l1 = myList.pop(0)
> l2 = myList.pop(0)
> listmerge = some_merge_function(l1, l2)
> myList.append(listmerge) # important that newly merged go
> to back of queue to get proper runtime
> return myList[0]
>
> here's what I'm trying to do for clojure, and it's a mess:
>
> (defn msort [toSort]
> (def sorted (let
> [myList (for [x toSort] [x])] <----- so far so good (not a
> real comment. I don't know how, yet)
> [
> (while (> (count myList) 1) <------- infinite loop the way
> written? I don't know how to overwrite myList
> (let [l1 (nth myList 0)][])
> (let [l2 (nth myList 1)][])
> (let [listmerge (some_merge_func l1 l2)][])
> (let [myList (concat (drop 2 myList) listmerge)][myList]) <---
> probably a different local variable
> )
> ]))
> sorted)
>
> doesn't compile anyway . . . I see that the let is causing the scope
> to be all screwed up. l1 and l2 can't be seen for the merge function.
>
> should I be using let at all here? Can things be redefined using
> def? see how much simpler it is not to say anything? Which is
> it .... def or let in python? Answer: No . . .but I'm sure there's
> value. This seems like something that might be in the FAQ. . . .or
> somewhere back in these discussions. I'll look around.
>
> Thanks.
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---