2014-01-22 1 views
-3

OCaml/Haskell/Erlangперевернутые подсписки на четных числах

У меня есть список L

L = [ [0, 3, 1], [7, 2], [5, 11], [7],[] ] 

И мне нужен выход, чтобы вернуть этот список списков, но для каждого четного Подсписок он должен отменить его, чтобы выход был следующим:

L = [ [1, 3, 0], [7, 2], [11, 5], [7],[] ] 

Предполагая, что мы подсчитываем позицию от 0.

Мне, вероятно, нужно получить информацию о том, сколько подсписок содержится в списке, а затем отменить все реплики.

Не могли бы вы представить мне ответ, который меня беспокоит?

+0

это просто 2D массив? –

+0

Да, 2D. Список, содержащий другие списки. –

+0

2D-массив или 2D-связанный список? –

ответ

2

Вот скелет решение в Haskell, за счет сопоставления Прямодушная шаблона:

reverseEverySecond :: [[a]] -> [[a]] 
reverseEverySecond []   = [] 
reverseEverySecond [x]   = [reverse x] 
reverseEverySecond (x : y : ys) = ... -- use reverse appropriately and recurse on ys 
1

Для реверсирования один список, вы можете просто использовать встроенный в reverse функции. Чтобы сделать это на чередующихся элементах, есть несколько способов, которыми вы могли бы это сделать. Вы могли бы написать функцию, как этот

addEveryOther :: Int -> [Int] -> [Int] 
addEveryOther n (x:y:xs) = x + n : y : addEveryOther xs 
addEveryOther n (x:[]) = x + n : [] 
addEveryOther n [] = [] 

В качестве альтернативы, вы можете сделать что-то вроде

addEveryOther n xs = map go $ zip [0..] xs 
    where 
     go (i, x) = if even i then x + n else x 

Но это, вероятно, будет медленнее, так как она включает в себя несколько операций и создания, а затем сразу же разрушающие кортежи.

+0

Если я не ошибаюсь, это не полный ответ функции, которую я запросил –

+1

@nobodynoone Я уверен, что это по дизайну. Вы не предоставили никаких попыток или кода самостоятельно, поэтому вам не следует ожидать полного ответа, всего лишь несколько советов. – kosmikus

+0

@nobodynoone Stackoverflow не является местом для запроса ответов, это место, где можно запросить помощь. Ознакомьтесь с FAQ, следуйте правилам. Я дал вам информацию, необходимую для решения проблемы самостоятельно. – bheklilr

1

Я предлагаю сочетание

cycle [id, reverse] :: [[a] -> [a]] 

zip :: [a] -> [b] -> [(a, b)] 

map (uncurry ($)) :: [(a -> b, a)] -> [b]