首页 > 解决方案 > 如何在 Haskell 中对列表进行回文化?

问题描述

palindromize :: [a] -> [a]
palindromize [] = []
palindromize [x] = [x]
palindromize (x:xs) = (x:xs) ++ reverse(x:xs)

我在haskell中做了这段代码,但在中间元素我不想看到双重,怎么做?(另一种我不想看到原始列表最后一个元素的方式)我应该使用 head 还是 tail 什么的?

像这样:回文“疯狂”==“女士”回文“种族”==“赛车”

标签: listhaskellelement

解决方案


我们可以使用tail :: [a] -> [a]获取一个列表,该列表包含列表的所有元素,除了第一个元素。事实上,Haskell 中的列表在概念上被定义为链表,tail因此可以看作是链表节点尾部的“getter”。

我们知道,如果我们反转一个非空列表,那么这个列表至少包含一个元素,所以我们知道这样的tail存在。因此,我们调用tail的结果reverse

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

我们也可以利用drop :: Int -> [a] -> [a],通过调用drop 1,我们提取一个没有第一个元素的列表,但drop 1更安全:因为空列表drop 1将返回空列表。如果我们使用drop 1,我们还可以去掉不同的子句:列表的回文是列表和我们从中删除第一个元素的列表的反向:

palindromize :: [a] -> [a]
palindromize l = l ++ drop 1 (reverse l)

推荐阅读