有幾種不同的方法來處理這個問題;雖然這很容易直接進行遞歸,但如果還有其他選項,請避免明確使用遞歸 。
這是使用一些列表實用程序的簡單版本。請注意,這是一個Haskell成語,我們正在操作的對象通常是最後一個參數。在這種情況下,切換參數讓我們把它寫成一個管道與它的隱式傳遞的第三個參數(列表):
after :: Int -> Int -> [Int] -> Bool
after a b = elem b . dropWhile (/= a)
希望這是很容易理解的;我們刪除列表中的元素,直到我們點擊一個a
,假設我們找到一個我們檢查其餘列表中是否有b
。如果沒有a
,這個列表是[]
,顯然那裏沒有b
,所以它按預期返回False。
如果'a'和'b'相等,您還沒有具體說明會發生什麼情況,所以我會留給您以適應這種情況。提示:添加一個tail
某處;)
這裏有一對夫婦的其他方法,如果你有興趣:
這是非常容易使用的摺疊處理;
我們有三種模型。或者我們正在尋找第一個元素,或者我們正在尋找第二個元素,或者我們已經找到它們(以正確的順序)。
data State =
FindA | FindB | Found
deriving Eq
然後,我們可以'摺疊'(又名減少)列表下來的結果是否匹配。
after :: Int -> Int -> [Int] -> Bool
after a b xs = foldl go FindA xs == Found
where
go FindA x = if x == a then FindB else FindA
go FindB x = if x == b then Found else FindB
go Found _ = Found
你也可以做到這一點遞歸,如果你喜歡:
after :: Int -> Int -> [Int] -> Bool
after _ _ [] = False
after a b (x:xs)
| x == a = b `elem` xs
| otherwise = after a b xs
乾杯!
如果num1,num2中沒有任何一個出現在列表中,例如: '[2,3,4] 5 2'或'在[2,3,4] 2 5'之後'或'在[2,3,4] 1 7'之後''之後? – niceman
順便說一下,你的函數不是遞歸的,它應該是 – niceman
那麼它應該返回假 – user3358850