list - 如何在 Haskell 中对列表进行回文化?
问题描述
palindromize :: [a] -> [a] palindromize [] = [] palindromize [x] = [x] palindromize (x:xs) = (x:xs) ++ reverse(x:xs)
我在haskell中做了这段代码,但在中间元素我不想看到双重,怎么做?(另一种我不想看到原始列表最后一个元素的方式)我应该使用 head 还是 tail 什么的?
像这样:回文“疯狂”==“女士”回文“种族”==“赛车”
解决方案
我们可以使用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)
推荐阅读
- python - 无法同时抓取字符串和列表
- javascript - React单选按钮:选中的循环未对齐
- html - 选择单选按钮后显示面板
- android - 使用 BottomNavigation 的 NavController 目的地未知
- node.js - 高图表导出服务器不显示图例 LabelFormatter
- c++ - 优化从子位掩码生成父位掩码
- node.js - 节点 js:sendgrid '访问被禁止'
- android - 在 Android 上使用 Yahoo 进行 Firebase 身份验证
- arrays - 如何从 Angular 数据库中的 ASP.NET Core API 下载和保存 pdf 文件?
- java - 使用 Vaadin 14 的 RTL 支持