【发布时间】: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