列表的Haskell递归

6jygbczu  于 2022-11-14  发布在  其他
关注(0)|答案(4)|浏览(176)

实作搜寻算法,在清单中搜寻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
czq61nw1

czq61nw11#

您可以使用模式匹配来获取前一个值。只需将匹配大小写的模式定义为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)
vc9ivgsu

vc9ivgsu2#

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

findPrev x xs = findNext x (reverse xs)
kyvafyod

kyvafyod3#

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

e5nqia274#

假设列表是有序的:

module FindPrevious where

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

相关问题