【问题标题】:How to check if two neighbors (element) in a string/array are the same如何检查字符串/数组中的两个邻居(元素)是否相同
【发布时间】:2012-09-25 20:44:27
【问题描述】:

基本上,我遇到了一个问题,如何让 haskell 中的函数像这样工作: 获取字符串的第一个元素,然后获取第二个元素并比较它们,然后该函数应继续从字符串中获取第三个元素并比较第二个和第三个元素。

如果必须比较前两个,那么接下来的两个会很容易,但在这种特殊情况下我无法弄清楚。

我需要完成这一步才能编写一个函数,如果找到两个相同的相邻元素,则返回 True,如果没有类似的元素则返回 False。

感谢您的帮助。

【问题讨论】:

    标签: function haskell functional-programming


    【解决方案1】:

    实现这一点的高阶方法(即没有显式递归)是使用zipWith 对列表中的元素进行逐点比较,从第一个开始,与列表中的元素进行比较,开始从第二个(使用tail)开始,然后使用or 将逐点结果折叠成一个结果。您甚至不需要对空列表进行特殊处理,因为 zipWith 如果其第二个参数是空列表,则其第三个参数是非严格的。

    编辑:解决方案(悬停显示)

    hasNeighbors as = or . zipWith (==) as $ tail as

    【讨论】:

    • 哇有趣,我很懒,但这对我来说仍然是一个更高的水平,但无论如何谢谢,我也会这样尝试。
    【解决方案2】:

    你可以创建一个递归函数来解决这个问题。有 3 种情况你必须处理:

    1. 如果函数得到一个空列表或一个元素的列表,那么显然它不会包含任何邻居,所以你返回False
    2. 如果列表以两个不相等的项目开头,则意味着它不是以邻居对开头,因此您应该检查除第一个元素之外的所有列表。
    3. 如果列表以两个相等的项目开头,则您知道该列表包含一对邻居,因此您可以返回True

    如果您希望我提供执行此操作的代码,或者您不想要更多提示,请告诉我。

    编辑:解决方案(悬停显示)

    hasNeighbors :: Eq a =&gt; [a] -&gt; True<br>hasNeighbors (a : allExceptA @ (b : _))<br>  | a == b = True<br>  | otherwise = hasNeighbors allExceptA<br>hasNeighbors _ = False

    【讨论】:

    • 好吧,这正是我卡住的地方。我知道并定义了空列表、单元素列表,并且正在考虑递归,我遇到的问题很好:
    • nghbor :: (Eq a) => [a] -> Bool nghbor [] = False nghbor [x] = False nghbor (x:y:s) = if x==y then True else eqngh()
    • 想想你应该用什么替换()。这是除了x 之外的所有列表,或者换句话说,前面有ys 列表。
    • 我不知道如何继续递归以使其像=> y:eqngh s,或者我应该以某种方式定义从列表中获取另一个 z
    • 试试eqngh (y : s)。除了第一个 x 之外,这将传递所有列表。
    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    相关资源
    最近更新 更多