Как палиндромизировать список в Haskell? - PullRequest
0 голосов
/ 06 января 2019
palindromize :: [a] -> [a]
palindromize [] = []
palindromize [x] = [x]
palindromize (x:xs) = (x:xs) ++ reverse(x:xs)

Я сделал этот код в haskell, но в среднем элементе я не хочу видеть двойной, как это сделать? (Еще один способ, которым я не хочу видеть оригинальный список последнего элемента) Должен ли я использовать голову или хвост или что-то?

Вот так: палиндромизировать "безумный" == "мадам" палиндромиз "гонка" == "гоночный автомобиль"

1 Ответ

0 голосов
/ 06 января 2019

Мы можем использовать tail :: [a] -> [a], чтобы получить список, содержащий все элементы списка, кроме первого. Фактически список в Haskell определяется концептуально как связанный список, и, таким образом, tail может рассматриваться как «получатель» хвоста узла связанного списка.

Мы знаем, что если мы перевернем непустой список, такой список содержит хотя бы один элемент, поэтому мы знаем, что такой tail существует. Поэтому мы называем tail результатом reverse:

palindromize :: [a] -> [a]
palindromize [] = []
palindromize xs = xs ++ <b>tail</b> (reverse xs)

Мы также можем использовать drop :: Int -> [a] -> [a], вызывая drop 1, мы извлекаем список без первого элемента, но drop 1 более безопасен: для пустой список drop 1 вернет пустой список. Если мы используем drop 1, мы также можем избавиться от различных предложений: палиндром списка - это список и обратный список, из которого мы отбросили первый элемент:

palindromize :: [a] -> [a]
palindromize l = l ++ <b>drop 1</b> (reverse l)
...