Haskell与列表的重复

时间:2017-10-18 05:43:34

标签: haskell recursion

实现搜索算法,该算法搜索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

4 个答案:

答案 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)