【发布时间】:2018-08-26 02:43:57
【问题描述】:
我正在尝试解决此练习,但我想不出解决方案。
我需要检查一个列表是否是回文,考虑以下因素:
如果列表很简单,我只需要检查它是否水平回文,但如果它是嵌套列表,我需要同时检查垂直和水平。
我还需要记住,列表中的每个元素都必须是回文本身,例如:
A = [1,2,3,3,2,1] 是回文
对于这种情况,我刚刚创建了一个使用 reverse 的函数:
unidimensional:: (Eq a) => [a] -> Bool
unidimensional [] = error"List is empty."
unidimensional xs = xs == reverse xs
也是这种情况,例如:
B = [[1,2,1],[1,2,1]] 水平回文并检查它是否是回文垂直我只是转置它, [[1,1],[2,2],[1,1]] 结果是,是的,它是双向回文。
我通过使用函数转置来垂直评估它是否是回文,然后使用我在检查它是否是水平回文之前使用的一维函数来解决这个问题,一切都很好:
--Checks if it's palindrome horizontally and vertically
bidimensional:: (Eq a) => [[a]] -> Bool
bidimensional [[]] = error"Empty List."
bidimensional (xs) = if left_right xs && up_down xs then True else False
--Checks if it's palindrome horizontally:
left_right (x:xs) = if x == reverse x then
if xs /= [] then bidimensional xs else True
else False
--Checks if it's palindrome vertically:
up_down:: (Eq a) => [[a]] -> Bool
up_down (xs) = left_right ys where ys = transpose xs
transpose:: [[a]]->[[a]]
transpose ([]:_) = []
transpose x = (map head x) : transpose (map tail x)
问题在这里:
我的程序需要接收的输入必须是这样的:
> palindrome [[1,2,2,1], [3,7,9,9],[3,7,9,9], [1,2,2,1]]
我的问题是:我的函数 palindrome 应该接收一个列表 [a] 作为参数,但是 palindrome 应该适用于嵌套列表,例如 [[[a]]] 或 [[a]]
palindrome 是接受输入的函数。
问题是当我得到一个简单的列表时,我的头,即 x 是一个数字,而 xs 是尾巴,将是其余的数字,没关系,但是当回文收到嵌套列表时,例如 [[[2,2],[2,2]],[[1,1],[1,1]]]
头部,x 现在是 [[2,2],[2,2]],所以我不能像二维那样使用我的函数,因为 [ [2,2],[2,2]] 不再是一个列表,当我尝试使用 xs 调用二维时,它是 [[2,2],[ 2,2]] 我收到一个错误:xs 现在是类型 a 而不是 [[a]]
我的问题是:考虑到我之前提到的错误,如何使我的函数回文,使用任何类型的列表(简单和嵌套)。提前致谢!
【问题讨论】:
-
您能告诉我们您的确切问题陈述吗? “[使]我的函数回文适用于任何类型的列表(简单和嵌套)”听起来像是一个相当奇怪的要求。有一些方法可以实现这样的目标,但它们不会像你想要的那样漂亮或方便。
-
声明说,给定输入:>回文 [[1,2,2,1], [3,7,9,9],[3,7,9,9], [ 1,2,2,1]],输出应该是这样的: > 列表是水平和垂直回文。我必须对函数 palindome 进行编码,即:palindrome :: [a] ->(这里是一个 Bool 字符串,表示该列表是回文)考虑到该函数应该适用于单个列表和嵌套列表,
-
写
if left_right xs && up_down xs then True else False是写left_right xs && up_down xs的更复杂的方式。另外,写if x then y else False是写x && y的复杂方式。
标签: haskell functional-programming palindrome