2017-11-02 3 views
0

나는 목록의 모든 k 번째 요소를 유지하는 하스켈 함수에서 함수를 작성하려고합니다.목록의 모든 k 번째 요소 찾기

> keepl 2 [3,4,5,6,7,8,9] 
[4,6,8] 

제가 아래의 함수를 시도했지만 출력 inconsistency.I를 보여주는리스트 그것이 [1,5,9-]

keepl k [] = [] 
keepl k (x : xs) = x : (keepl k $ drop k xs) 

main = do 
print $ keepl 3[1,2,3,4,5,6,7,8,9] 
+1

당신은 무엇을 시도 했습니까? 예를 들어 "현재 색인"인수를 사용하여 목록에서 재귀를 사용하여이 문제를 해결할 수 있습니다. – chi

+1

니스, 너 뭐 해봤 니? –

+0

그래 .. 나는 노력하고 있지만 지금까지 나는 그것을 올바르게 얻지 못했다. 그래서 도움이 필요하다. – Bond007

답변

0
로오고 [3,6]뿐만 아니라 갈래

숙제 문제처럼 들리므로 완전한 대답이 아닙니다. 하지만 여기에 힌트가 있습니다. let (y:ys) = drop (k-1) xs 인 경우 y이 목록에 추가 할 다음 요소이며, 나머지는 반올림하기 위해 kys과 함께 반복적으로 함수를 호출 할 수 있습니다. 재귀를 종료하는 기본 사례는 length xs < k 일 때입니다.

당신은 재귀 함수를 작성하여 올바른 생각을 가졌습니다. 결과의 첫 번째 요소가 목록의 첫 번째 요소가 아니라 k 번째 요소가되도록하려면 drop 전에 입력 목록의 머리글을 추가하지 마십시오.

다른 가능한 접근 방법이 있지만 재귀 적 방법은 가장 간단하고 (아마도 가장 효율적입니다.) 과도하게 똑똑한 사람도 있습니다 : map last . unfoldr (\xs -> if length xs < k then Nothing else Just (splitAt k xs)). unfoldr을 호출하면 helper 함수가 반복적으로 호출되어 목록을 길이가 k 인 청크로 분할하여 남은 부분을 버립니다. 그런 다음 map은 각 청크의 마지막 요소를 사용합니다. 또는 인덱스 목록을 생성하고 각각에 !!을 매핑하십시오. 이 하스켈 학습에 대한 exercide 인 경우 도서관,

import Data.List.Split 
let keepl k x = map last $ chunksOf k x 

그렇지 않으면이 작업 작업을 사용하려는 당신이 바퀴를 다시 작성하려면

0

이 작동합니다 :

import Data.List 

keepl k n [] = [] 
keepl k 1 (x:xs) = x : (keepl k k xs) 
keepl k n (x:xs) = keepl k (n-1) xs 

main = do 
print $ keepl 3 3 [1,2,3,4,5,6,7,8,9] 
+0

FTR,'chunksOf n = map (테이크 n). takeWhile (not null). iterate (drop n)'. 또한 직접 구현할 수도 있고 사용할 수도 있습니다. 그러나 첫 번째 해결 방법은 올바른 결과를 제공하지 못합니다. 'keepl 3 "abcd"'는''cd "'를 제공합니다. 두 번째는 불필요하게 복잡합니다. – leftaroundabout

0

자, 함수는 모든 k 번째 요소를 제공합니다 (실제로는 k 번째 +1 번째 요소입니다. 왜냐하면 k을 드롭하고 하나도 유지하기 때문입니다 ...) 그냥 ... 즉, 요소들 [0, k, 2 · k +1, 3 · k + 2 ...]를 취한다. keepl k (x:xs) = x : ... 절이 결과에 x을 앞에 붙이기 때문입니다.당신은 일부를 삭제 후 요소 을하려면 대신하는 경우

, 그 밖으로 쓰기 :

keepl k xs = case drop k xs of 
    ... 
0

당신은 단지 길이 k의 하위 목록에 원래 목록을 분할 수 splitAt를 사용하여 :

splitlists :: Int -> [a] -> [[a]] 
splitlists _ [] = [] 
splitlists k xs = first : (splitlists k rest) 
    where 
     (first, rest) = splitAt k xs 

그래서 전화 등 :

splitlists 2 [3,4,5,6,7,8,9] 
,691

[[3,4],[5,6],[7,8],[9]] 

는 그런 길이 k의 모든 하위리스트의 마지막 요소를 가지고, 새로운 목록에 추가 :

keepl :: Int -> [a] -> [a] 
keepl _ [] = [] 
keepl k xs = [last x | x <- splitlists k xs, length x == k] 

예 호출

> keepl 2 [3,4,5,6,7,8,9] 
[4,6,8] 
> keepl 3 [3,2,1,4,5,6,9,8,7,10] 
[1,6,7] 
363,210

이 초래

관련 문제