Haskell permutation
Last time I wrote this for creating permutations:
permutation :: Eq a => [a] -> [[a]] permutation [] = [[]] permutation xs = do x <- xs ys <- permutation (delete x xs) return (x:ys)But after comparing to the one built in Ruby:
array.permutation.to_aI found that the Haskell one is actually wrong!
The problem is, if
xs has duplicated elements,then we might pick one element but delete the other.
Consider input
"aba", and x would be iterating through'a', 'b', 'a', but what we delete would be 'a', 'b', andfirst
'a' again. Here's an updated version, morecomplicated though :( The point is, we need to
know which exactly
x and the remaining is.So introducing a new function might be a must?
I am not sure though.
split :: [a] -> [a] -> [(a, [a])] split [] _ = [] split (x:xs) ys = (x, reverse ys++xs) : split xs (x:ys) permutation :: Eq a => [a] -> [[a]] permutation [] = [[]] permutation xs = do (y, ys) <- split xs [] zs <- permutation ys return (y:zs)


0 retries:
Post a Comment
Note: Only a member of this blog may post a comment.