Haskell - 获取列表的中间数字

时间:2016-07-05 00:53:25

标签: haskell

我对Haskell很新。我想按以下方式重新排序列表:

[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 个答案:

答案 0 :(得分: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

打破它:

  • 首先获得中点
  • 接下来获取列表的两半,不包括中间元素
  • 使用zip
  • 从外部构建列表
  • 将zip结果连接成展平并添加到中间元素列表

Demo