我希望在字符串中出现所有出现的字符。 所以例如,如果我有字符串“nunddrdr”,我想得到“nnudddrr”。
这就是代码应该如何实现的目的:
usort :: String -> String
l :: String
l = ""
usort (x:xs)
| xs == [] = l ++ [x]
| otherwise = l ++ [n | n <- (x:xs), n = x] ++ usort (xs)
它无法正常工作,因为它还会处理已使用过的字符。
答案 0 :(得分:2)
您已正确观察到对usort
的递归调用未删除已使用过的字符,因此您需要修改该函数以便执行此操作。您可以使用filter
仅选择符合某些条件的列表元素,因此我们可以删除已使用的字符,如下所示:
filter (\=x) xs
我们可以使用
以相同的方式选择与x
匹配的所有字符
filter (==x) xs
您可以使用这两件事来创建usort
功能:
usort (x:xs) = x : (filter (==x) xs) ++ usort (filter (/=x) xs)
但是,当您尝试对空列表进行排序时,您未能考虑这种情况,因此您还需要添加:
usort [] = []
把它放在一起,你得到
usort::(Eq a)=>[a]->[a]
usort [] = []
usort (x:xs) = x : filter (==x) xs ++ usort (filter (/=x) xs)