(defn removeFirst
  [x xs]
  (if (= x (first xs)) (rest xs) (cons (first xs) (removeFirst x (rest 
xs)))))

(defn perms  
  ( [] [[]])
  ([xs]

  (for [x xs p (perms (removeFirst x xs))] (cons x p))  )

)

Good day,
I have been studying a functional approach to the design and analysis of 
algorithms. I am trying to generate permutations by performing a list 
comprehension to implement the following piece of haskell 


perms [] [[]]
perms [x:p | x<-xs, p<-perms(removeFirst x xs)] 

where 

removeFirst x [] = []
removeFirst  x (y:ys) | x == y   ys
                                  | otherwise  = y : removeFirst x ys

This is my attempt in clojure:

(defn removeFirst
  [x xs]
  (if (= x (first xs)) (rest xs) (cons (first xs) (removeFirst x (rest 
xs)))))

(defn perms  
  ( [] [[]])
  ([xs]

  (for [x xs p (*perms* (removeFirst x xs))] (cons x p))  ) ;; I have tried 
using *recur* instead of *perms* here , but clojure complains that     
       
                                                                                
         
;;I cannot recur there - I guess not in tail position

)

(perms [1 2 3])

===============

This is the output I receive in the repl (*IntelliJ IDEA*)

#'user/removeFirst
user=>#'user/perms
user=> user=>()
user=> user=> user=>
=================

This is how it looked on *lightTable*

(defn removeFirst
  [x xs]       *1 (1)*
  (if (= x (first xs)) (rest xs) (cons (first xs) (removeFirst x (rest 
xs))))) *1 (1) (1) (1) 1 (1)

*(defn perms  
  ( [] [])
  ( [xs]

  (for [x xs p (perms (removeFirst x xs))] (cons x p))) *() () () () ()*

)


(perms [1 2 3]) *()*

Any idea what's wrong?

Thanks

Keith

-- 
-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to