2016-07-05 2 views
0

저는 하스켈을 매우 신 'm습니다. 나는 다음과 같은 방법으로 목록의 순서를 변경하려면 : 중간 번호 또는 목록의 번호를 얻고 시작 위치에 넣어하는 가정 것하스켈 - 목록의 중간 번호 받기

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

. 그 다음 목록의 두 개의 외부 번호를 가져 와서 추가하고 시작해야합니다. 중간 번호를 가져 와서 목록의 시작 부분에 넣으려면 다음 코드를 사용하지만 방법을 알 수는 없습니다. 새 목록에 외부 번호를 추가하기 시작합니다.

코드 : 고급의

-- import Data.List 
-- import System.IO 

longitude xs = length xs 

middle xs = length xs `div` 2 

addOne xs = middle xs - 1 

oneMore xs = length xs - 1 

otherCase xs = oneMore xs `div` 2 

valuea xs = xs !! middle xs 

valueb xs = xs !! addOne xs 

valuec xs = xs !! otherCase xs 

modulus xs = longitude xs `mod` 2 

order xs = midNums xs 

takes xs = take (otherCase xs) xs 

oddOne xs = otherCase xs + 1 

takeX xs = drop (oddOne xs) xs 

value xs = takes xs ++ takeX xs 

reorder xs = drop (otherCase xs)(take (middle xs + 1) xs) 

valueOdd xs = reorder xs ++ takes xs ++ takeX xs 

paruno xs = drop (middle xs + 1) xs 

pairTwo xs = take (addOne xs) xs 

midPair xs = take (addOne xs)(drop (middle xs -1) xs) 

--Get the numbers 
midNums xs = if modulus xs == 0 then midPair xs ++ paruno xs ++ pairTwo xs 
else valueOdd xs 

덕분에, 어떤 도움을 크게 감사합니다.

편집 : Demo

답변

1

이 시도 :

f :: (Num a) => [a] -> [a] 
f [] = [] 
f [x] = [x] 
f xs = if len `mod` 2 == 1 then flatten [xs !! half] else flatten [xs !! (half-1), xs !! half] 
    where len = length xs 
      half = len `div` 2 
      firsthalf = take (half-1) xs 
      secondhalf = (reverse . take half . drop (half+1)) xs 
      outtoin = zipWith (\x y -> x:y:[]) firsthalf secondhalf 
      flatten = concat . flip (:) outtoin 

내려 속보 : 나는 다음과 같이 작업 할

  • 먼저 (들) 중간 점을 얻을
  • 다음으로 목록의 두 부분을 구하십시오. 그러나 그것은 작동하지 않습니다, 외부 안쪽으로 작동

Demo

+0

감사를 평평하고 가운데 요소 목록에 추가 연결할에게 우편 결과를 우편

  • 를 사용 목록을 작성 중간 요소
  • 를 luding 내가 원하는 방식으로 작동합니다. 두 개의 중간 번호 뒤에있는 목록의 바깥 쪽 번호를 입력하고 작업을 시작하십시오.이 [Demo] (http://rextester.com/EBSFBF27492) –

  • +0

    처럼 코드를 업데이트했습니다. 'secondhalf' 함수에서 인덱싱을 조금 해보았습니다. 다시 시도하고 싶을 수도 있습니다. –