任何人感兴趣的解决方案:
f :: Ord a => [a] -> [a]
f [] = []
f [x] = []
f (x:y:xs)
| x < y = max x y : f (y:xs)
| otherwise = f (y:xs)
示例输入:
f [1,3,2,4,3,4,5] == [3,4,4,5]
f [5,10,6,11,7,12] == [10,11,12]
更新的代码:
f [] = []
f [x] = [x]
f (x:y:xs)
| x < y = max x y : f (y:xs)
| otherwise = f (y:xs)
问题在于它两次输出最后一个数字:
f [5,10,6,11,7,12] == [10,11,12,12]
下面的旧内容
我正在编写一个接受列表并返回大于上一个元素的元素的函数。我想出了这个,但是问题是当它到达最后一个元素时,xs !! 0不存在,因此错误。在这种情况下如何定义正确的退出点?
我的代码:
f :: Ord a => [a] -> [a]
f [] = []
f (x:xs) = max x (xs !! 0) : f xs
错误:
[3,3,4,4,4,5,*** Exception: Prelude.!!: index too large
答案 0 :(得分:3)
您并不总是要向结果中添加新元素;有时您什么都不添加。
f :: Ord a => [a] -> [a]
f [] = []
f [x] = [x]
f (x:y:xs) = _ -- what goes here?
对于您的递归情况,有两种可能性:
x < y
,则将y
添加到结果中。y
。实际上,您不会添加任何内容。在任何一种情况下,您都需要在递归调用中包括y
,而不仅仅是xs
,以便在下一次迭代中,y
将是要与之进行比较的第一个元素 it 之后的那个。
我将其作为练习将上述逻辑作为递归案例来实现。