繁体   English   中英

获取列表的中间数字并将其放在开始位置-Haskell

[英]Get middle number(s) of a list and put them in the start positions - Haskell

好,大家好 我一直在尝试这个问题,但没有成功。 我想做的就是获取列表的中间数字,将它们移到列表的起始位置。 例如:

[5,6,8,9,0] => [8,5,6,9,0] // 8移到起始位置。

[5,6,7,8] => [6,7,5,8] //将两个中间数字移到起始位置。

到目前为止,我已经能够获得列表的两个中间数字(下面的代码),但这就是我遇到的问题,并且不知道如何移动数字。

我的代码:

middle :: [a] -> [a]
middle xs = take (signum ((l + 1) `mod` 2) + 1) $ drop ((l - 1) `div ` 2) xs
  where l = length xs

我建议这样做:

splitMiddle :: [a] -> ([a], [a], [a])

它会返回哪里

(beginning, middle, end)

那你就可以做

middleToFront :: [a] -> [a]
middleToFront xs
    let (beginning, middle, end) = splitMiddle xs
    in middle ++ beginning ++ end

要实现splitMiddle ,我建议将其分解为几个步骤

-- This is actually available in Data.List more efficiently,
-- but you can implement it yourself for practice
splitAt :: Int -> [a] -> ([a], [a])
splitAt n xs = (take n xs, drop n xs)

splitMiddle :: [a] -> ([a], [a], [a])
splitMiddle xs =
    let l = length xs
        beginningLength = ???
        (beginning, rest) = splitAt beginningLength xs
        middleLength = ???
        (middle, end) = ???
    in (beginning, middle, end)

您需要填写??? s,我不会为您解决所有问题;)

您可以使用(:)将该项目放在列表的前面。 对于奇数长度的情况,可以执行以下操作:

(xs !! middleLoc):(take middleLoc xs ++ drop (middleLoc + 1) xs)
where
    middleLoc = l `quot` 2

您可能需要针对偶数长度的情况进行修改,您可能需要单独识别和处理(即拔出并在前面加上两项)。 我将其留给您添加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM