【问题标题】:Haskell recursion with lists带有列表的 Haskell 递归
【发布时间】:2017-10-18 05:43:34
【问题描述】:

实现一个搜索算法,在列表中搜索 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

【问题讨论】:

标签: haskell recursion


【解决方案1】:

您可以使用模式匹配来获取先前的值。只需将匹配案例的模式定义为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)

【讨论】:

  • 这应该重命名为findPrev。除此之外,它看起来还可以。
【解决方案2】:

开箱即用(但效率低下)的答案:在列表的反转上使用findNext

findPrev x xs = findNext x (reverse xs)

【讨论】:

    【解决方案3】:
    findPrev :: Int -> [Int] -> Int
    findPrev _ [] = -1
    findPrev n (x:xs)
        | xs == [] = -1
        | n == head xs = x
        | otherwise = findPrev n xs
    

    【讨论】:

    • 是的,这是我遇到的第一个问题的代码。我发布的是我现在需要为列表中的前一个号码做这件事,这就是我迷路的地方。我什至在顶部发布了相同的代码,这样每个人都可以看到我到目前为止为下一个数字做的事情,因为我理解那个
    • 对不起,@loutej。我忘了更改函数的名称。这可能会让您感到困惑,但是此代码的工作方式与您想要的完全一样...
    【解决方案4】:

    假设列表是有序的:

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

    【讨论】:

      猜你喜欢
      • 2015-07-31
      • 2019-07-21
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 2013-01-17
      • 2015-03-10
      • 1970-01-01
      相关资源
      最近更新 更多