[英]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.