은 몇 가지 제안
del
은 필터를 사용하기보다는 자신의 재귀를 작성 구현 될 수있다. 당신의 정의에 실수가 있었는데 삭제하는 동안 ys
이 아니라 y
이 아닌 것이 필요했습니다.
del x = filter (/=x)
obj
상이한 필터 기능 del
유사하다. 마찬가지로 정의에서 ys
이 아니라 y
이 아닌 obj
을 입력해야합니다.
obj x = filter (==x)
tam
은 length
기능 당신은 n1
및 n
에 대한 목록을 보관할 필요가없는
-- tam = length
입니다. 알고리즘을 변경하지는 않았지만 코드를 더 읽기 쉽게 만들었습니다.
fun n1 n [] =n1
fun n1 n [email protected](x:s) | length (obj x xs) > n = fun x (length $ obj x xs) (del x xs)
| otherwise = fun n1 n $ del x xs
rep [email protected](x:s) = fun x (length $ obj x xs) (del x xs)
또 다른 방법은 매우 최적의하지만 훨씬 더 읽을 수없는 내가이 코드가 무엇을하고 있는지 간단히 설명하려고합니다
import Data.List
import Data.Ord
rep :: Ord a => [a] -> a
rep = head . head . sortBy (flip $ comparing length) . group . sort
입니다. 마음에 드는 첫 번째 아이디어는 모든 요소의 빈도를 찾는 것입니다. 따라서 가장 빈번한 요소를 찾아야합니다. 이제 group
은 인접한 유사한 요소를 결합하는 함수입니다.
> group [1,2,2,3,3,3,1,2,4]
[[1],[2,2],[3,3,3],[1],[2],[4]]
그래서 난 그냥 요소의 가장 많은 하위 목록을 찾는 감소 최대 주파수 요소를 찾기 서로
> sort [1,2,2,3,3,3,1,2,4]
[1,1,2,2,2,3,3,3,4]
> group . sort $ [1,2,2,3,3,3,1,2,4]
[[1,1],[2,2,2],[3,3,3],[4]]
에 인접 동일한 요소를 가지고 정렬을 사용했다. 주어진 비교 기능에 따라 정렬 할 수있는 함수 sortBy
이 있습니다. 따라서 기본적으로 하위 목록의 length
을 정렬했습니다 (이 플립은 오름차순보다는 오름차순으로 정렬을 정렬합니다).
> sortBy (flip $ comparing length) . group . sort $ [1,2,2,3,3,3,1,2,4]
[[2,2,2],[3,3,3],[1,1],[4]]
지금 당신은 가장 큰 주파수를 가진 요소를 얻을 수
head
두 번 걸릴 수 있습니다.당신은 당신이 달성하고자하는 것을 수행하는 코드에서 몇 가지 아이디어를 얻을하고자하는 경우
당신이 시도 무엇을 게시하시기 바랍니다. – luqui
태그가 지정된 재귀가 왜 발생합니까? –
재귀와 함께하고 싶습니다 – Urah