2015-05-22 3 views
0

мне нужна функция (или два), которые должны сделать что-то вроде этого:Переключение 2 элементов в списке по индексу Haskell

swap 2 [1,2,3,4] -> [1,3,2,4] 
swap' 2 [1,2,3,4] -> [1,2,4,3] 

Первое число является показателем значения Я хочу, чтобы переместить влево и справа (это не может быть 0 или длина моего списка).

Я знаю, что это, возможно, было опубликовано раньше, но я не мог найти ничего полезного.

+0

Я думаю, что это могло бы быть полезным http://stackoverflow.com/questions/5852722/replace-individual-list-elements-in-haskell –

ответ

1

соответствие шаблону полезно здесь

swap 1 (x:y:rest) = y:x:rest 
swap n (x:y:z:rest) = x : swap (n - 1) (y:z:rest) 
swap _ _ = error "Not enough elements to swap" 

Заметим, что это не остерегаться неположительного n, вы можете добавить, что особенность самостоятельно.

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

+0

Он работает. Большое спасибо! –

Смежные вопросы