【问题标题】:Unexpected issue with max function in HaskellHaskell中max函数的意外问题
【发布时间】:2018-04-06 04:53:04
【问题描述】:

我有一个删除列表最大值的函数,它似乎可以工作,当我继续添加数字时,它可以工作,直到我添加一个新的高数字。然后它仍然只会删除旧的最大数量。但是当我开始一个新列表时,它会再次起作用。谁能解释发生了什么,我做错了什么?

    removeMax :: [Int] -> [Int]
    removeMax [] = []
    removeMax [x] = [] 
    removeMax (x:y:xs)
        | x > y = (y:xs)
        | otherwise = x : removeMax (y:xs)

这是我做的几个测试的输出:

    *Main> removeMax [1,9,3,2,6]
    [1,3,2,6]
    *Main> removeMax [1,9,3,2,6,8]
    [1,3,2,6,8]
    *Main> removeMax [1,9,3,2,6,8,7]
    [1,3,2,6,8,7]
    *Main> removeMax [1,9,3,2,6,8,7,14]
    [1,3,2,6,8,7,14]
    *Main> removeMax [1,9,3,2,6,8,7,14]
    [1,3,2,6,8,7,14]
    *Main> removeMax [1,9,3,2,6,8,7,14]
    [1,3,2,6,8,7,14]
    *Main> removeMax [1,3,14,5]
    [1,3,5]
    *Main> removeMax[1,3,8,9]
    [1,3,8]
    *Main> removeMax [1,2,3,67,87,12]
    [1,2,3,67,12]
    *Main> removeMax [1,2,3,67,87,12,88]
    [1,2,3,67,12,88]

如您所见,当您继续在新列表上执行此操作以及使用旧列表并仅添加较小的数字时,它会起作用。

【问题讨论】:

  • 如果 下一个值 小于该值,那么您的函数将删除值。所以9 在你的第一个例子中被删除了。
  • 是的,我明白这一点,但是我发布的问题是什么?
  • 您的函数没有删除最大值。它会删除第一个值,然后是一个较小的值——这可能是也可能不是最大值。您需要扫描列表两次:一次查找最大值,另一次将其删除。一次性完成似乎更棘手(并且可能需要一些微妙的技巧,比如打结,你现在应该忽略它)。

标签: list function haskell recursion max


【解决方案1】:

您的函数的行为方式没有什么奇怪的 - 您定义它是为了删除第一个大于其后继数字的数字

要真正从给定列表中删除最大值,最简单的方法是:

  • 通过扫描整个列表找到最大值
  • 删除它

使用两个辅助函数来实现这种方法非常简单:

  findMax: [Int] -> Int
  removeElement: [Int] -> Int -> [Int]

但是,您还应该考虑边缘情况:

  • 如果最大值多次出现会怎样? IE。 removeMax [1, 3, 2, 3] 应该返回[1,2,3][1,2][1,3,2] 吗?
  • 您的新实现是否正确处理空列表? (你现在的)

【讨论】:

  • 问题似乎不是说我可以使用两种方法。如果有一种方法可以用另一种方法来做,那么我什至不知道从哪里开始,教授没有解释。但是谢谢你,我现在明白我做错了什么。哦,好吧,回到绘图板。
猜你喜欢
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多