2016-06-16 4 views
0

Ok、hi everyone。私は今、成功していないのに、これをリリートのために試してきました。私がしたいことは、リストの中間の数字をリストの開始位置に移動させることです。例:リストの中間の番号を取得し、開始位置に配置します。 - Haskell

[5,6,8,9,0] =>[8,5,6,9,0] // 8を開始位置に移動しました。

[5,6,7,8] =>[6,7,5,8] // 2つの中間の数字が開始位置に移動されました。

これまでのところ、リストの2つの中間の数字(下のコード)を得ることができましたが、それは私が立ち往生して数字を移動する方法を知らないところです。

マイコード:

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

答えて

0

あなたがリストの先頭にその項目を付加する(:)を使用することができます。奇数の長さの場合には、次のようにあなたがこれを行うことができます:

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

をあなたは(IE-引き出し、2を付加別に特定し、対処することがありますでも長さの場合、これを変更する必要がありますアイテム)。私はそれをあなたに追加しておきます。私はこのようにそれをやって推薦する

1

:その後、あなただけsplitMiddleを実装するには

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

を行うことができ、それは

(beginning, middle, end) 

を返します

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

、私がお勧めしたいですいくつかのステップに分割する

-- 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) 

あなたは私はあなたのためにそれのすべてを解決するつもりはない、???秒に記入する必要があります;)

関連する問題