实现搜索算法,该算法搜索Int n的列表并在n之前返回列表中的值。如果没有值,或者列表为空,则返回-1。例如,findPrev 5 [1,2,3,4,5,6]应返回4,而findPrev 5 [0,10,20,30]返回-1。
现在我找到了这个号码,但不知道如何获得前一个号码。有人可以帮我解释一下吗?以下是我如何做第一个,不知道它是否会帮助你理解我在哪里:
findNext :: Int -> [Int] -> Int
findNext _ [] = -1
findNext n (x:xs)
| n == x = head xs
| otherwise = findNext n xs
答案 0 :(得分:4)
您可以使用模式匹配来获取之前的值。只需将匹配大小写的模式定义为x:y:xs
,以匹配具有至少两个元素的列表。在其他情况下,可以明确说明空单和单例列表的情况:
findPrev :: Int -> [Int] -> Int
findPrev _ [] = -1
findPrev _ [_] = -1
findPrev n (x:y:xs) = if n == y then x else findPrev n (y:xs)
答案 1 :(得分:1)
开箱即用(但效率低下)答案:在列表反转时使用findNext
。
findPrev x xs = findNext x (reverse xs)
答案 2 :(得分:0)
findPrev :: Int -> [Int] -> Int
findPrev _ [] = -1
findPrev n (x:xs)
| xs == [] = -1
| n == head xs = x
| otherwise = findPrev n xs
答案 3 :(得分:0)
假设订单已订购:
module FindPrevious where
findPrevious n xs
| n `elem` xs = last $ takeWhile (<n) xs
| otherwise = (-1)