2017-10-18 3 views
0

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 
+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と定義し、リストを少なくとも2つの要素と照合してください。空とシングルトンリストの例は、他のケースでは、明示的に綴ることができます。

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'に名前を変更する必要があります。それとは別に、それはOKのように見えます。 – 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) 
関連する問題