我正在嘗試撰寫一個函式detadj :: String -> Bool,該函式接受一個字串,如果該字串包含兩個相同的相鄰字符,則回傳 true。例如:
detadj "" == False
detadj "s" == False
detadj "ss" == True
detadj "Misisipi" == False
detadj "Mississippi" == True
detadj "single-dash" == False
detadj "double--dash" == True
我有兩個版本的函式一個在串列理解中,這在很多情況下都是錯誤的,但最普遍的一個是當detadjlc ["ss"]它由于(x:y:xs)位的使用而輸出一個空串列時:
detadjlc :: String -> Bool
detadjlc [] = False
detadjlc [x] = False
detadjlc (x:y:xs) = head[ x == y && isAlpha x == isAlpha y | (x,y) <- zip (x:y:xs) xs ]
和遞回(當輸入類似于detadjr [" ee"]whichFalse而不是時,這不起作用True):
detadjr :: String -> Bool
detadjr [] = False
detadjr [x] = False
detadjr (x:y:xs) | x == y = True
| otherwise = d xs
有什么方法可以解決這些問題?
uj5u.com熱心網友回復:
你的遞回函式很好,除了一個小細節:你忘記把y遞回呼叫放回串列中。(我認為d是 的拼寫錯誤detadjr。)僅僅因為x和y不同并不意味著y的第一個字符xs可能不相同。
detadjr :: String -> Bool
detadjr (x:y:xs) = (x == y) || detadjr (y:xs)
detadjr _ = False
(如果您首先檢查 2 個或更多字符的字串,那么單例和空串列可以合并為一個基本情況。)
uj5u.com熱心網友回復:
以下是使用串列理解的迭代解決方案。我們創建一個包含輸入串列相鄰元素的元組串列。然后我們比較元組中的那些元素。
detadjlc :: String -> Bool
detadjlc xs = or [x == y | (x, y) <- zip xs (tail xs)]
遞回解決方案最好完成,因為@chepner 已經發布。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/329930.html
