我必须编写一个函数,该函数将字符串的第一个字母大写,并将字符串的其余部分小写(此字符串包含随机的大写或小写字母)。
到目前为止,我已经做到了:
capitalised :: String->String
capitalised [] = []
capitalised x
| length x == 1 = map toUpper x
| otherwise = capitalised (init x): map toLower (last x)
以及所有其他奇怪的功能,但我仍然无法弄清楚。
请帮忙!提前发送!
忘了提,问题指出我需要编写一个递归解决方案!
还记得aString
只是它的类型同义词[Char]
吗?在这里,我们利用它:
import qualified Data.Char as Char
capitalized :: String -> String
capitalized (head:tail) = Char.toUpper head : map Char.toLower tail
capitalized [] = []
这是一个递归版本:
capitalized :: String -> String
capitalized [] = []
capitalized (head:tail) = Char.toUpper head : lowered tail
where
lowered [] = []
lowered (head:tail) = Char.toLower head : lowered tail
这应该是对我的问题最简洁,最正确(也是最快速)的答案。非常感谢您的帮助。但是,我忘记在问题中提及一些关键字。该功能应以递归方式编写。有解决方案吗?TXX!
这是家庭作业吗?如果我是您,我真的很想独自解决。此外,它确实非常琐碎。无论如何,请参阅更新。
是的,实际上我已经自己解决了。对于您的持续帮助,我仍然会接受您的回答。但是我认为您也应该看看这个解决方案,因为它反过来处理字符串
capitalised :: String->String capitalised (x:[]) = [toUpper x] capitalised x = capitalised $ init x ++ [toLower $ last x] capitalised x = capitalised $ init x ++ [toLower $ last x]
@oasisweng您提议的实现会给您带来可怕的性能,因为
last
和init
操作都需要遍历整个列表,换句话说,它们的时间复杂度均为O(n)
。另外,您在迭代的每个步骤都调用了这些函数,因此总的来说O(n * (n + n))
,函数的时间复杂度为。一个缺点操作(:
),另一方面具有的复杂性O(1)
,所以我的两个解决方案有一个产生的只是复杂O(n)
。很好解释,TX!