2017-10-18 48 views
0

实施一种搜索算法,该搜索算法搜索Int n列表并在n之前返回列表中的值。如果没有值,或者列表为空,则返回-1。例如,findPrev 5 [1,2,3,4,5,6]应该返回4,而findPrev 5 [0,10,20,30]返回-1。Haskell Recove With Lists

现在我找到了这个号码,但不知道如何获得以前的号码。有人可以帮我解释一下吗?这里是我做的第一个,不知道这是否会帮助你理解我在这个地方:

findNext :: Int -> [Int] -> Int 
findNext _ [] = -1 
findNext n (x:xs) 
    | n == x = head xs 
    | otherwise = findNext n xs 
+3

的[Haskell的递归功能和语法(可能的复制https://stackoverflow.com/questions/46720233/haskell-recursion-functions-and-语法) –

回答

0
findPrev :: Int -> [Int] -> Int 
findPrev _ [] = -1 
findPrev n (x:xs) 
    | xs == [] = -1 
    | n == head xs = x 
    | otherwise = findPrev n xs 
+0

是的,那是我的第一个问题的代码。我发布的是,我需要为列表中的前一个号码做这个,这是我迷路的地方。我甚至发布了相同的代码,所以每个人都可以看到我对于下一个数字所做的工作,因为我明白 –

+0

对不起,@loutej。我忘了更改函数的名字。它可能会让你感到困惑,但是这段代码的工作原理与你想要的一样... – aLeX

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

这应该重命名为'findPrev'。除此之外,它看起来不错。 – chi

1

外装即用(但低效的)答案:在列表的逆转使用findNext

findPrev x xs = findNext x (reverse xs) 
0

假定列表被排序:

module FindPrevious where 

findPrevious n xs 
    | n `elem` xs = last $ takeWhile (<n) xs 
    | otherwise = (-1)