Pus*_*yon 2 string recursion haskell functional-programming list
我正在尝试编写一个Haskell函数,它接受一个字符串列表,比较列表中的所有字符串,并输出一个长度最长的字符串列表.我想在没有任何预定义函数或导入的情况下执行此操作,我想尝试以递归方式计算出来.例如:
longeststrings["meow","cats","dog","woof"] -> ["meow","cats","woof"]
Run Code Online (Sandbox Code Playgroud)
我知道这是一个愚蠢的例子,但我认为这证明了这一点.
我想做点什么
longeststrings:: [string] -> [string]
longeststrings [] = []
longeststrings [x:xs] = if (x > xs) x:longeststrings[xs]
Run Code Online (Sandbox Code Playgroud)
但我不知道如何只从列表中取出最大的字符串,或删除最小的字符串.我将不胜感激任何帮助.
你可以轻而易举地跟踪最长的字符串和一个长度值的累加器.
longestStrings :: [String] -> [String]
longestStrings = go [] 0
where
go acc _ [] = acc -- base case
go acc n (x:xs)
| length x > n = go [x] (length x) xs
-- if x is longer than the previously-seen longest string, then set
-- accumulator to the list containing only x, set the longest length
-- to length x, and keep looking
| length x == n = go (x:acc) n xs
-- if x is the same length as the previously-seen longest string, then
-- add it to the accumulator and keep looking
| otherwise = go acc n xs
-- otherwise, ignore it
Run Code Online (Sandbox Code Playgroud)
或者,正如Davislor在评论中正确提到的那样,这可以通过教导辅助函数来确定其最长的长度来实现.
longestStrings :: [String] -> [String]
longestStrings = foldr f []
where
f x [] = [x]
f x yss@(y:_) =
case compare (length x) (length y) of
GT -> [x]
EQ -> x : yss
LT -> yss
Run Code Online (Sandbox Code Playgroud)