我正在尝试编写一个带字符串并将其分成两个字符串的函数。第一个应该只包含小写字母,第二个只包含大写字母。
我已经提出了一个有效的解决方案,但我希望能够只有一个函数只能通过字符串一次。我现在已经尝试了整整一天,但未能提出解决方案,所以我想要一些帮助。
棘手的部分是我必须使用递归来做到这一点。 我已经提出了一个非常简单的迭代解决方案,但如前所述,我必须以递归方式执行此操作。
这是一项家庭作业,所以我不是在寻找某人为我做这份工作,但是一些提示和解释会非常受欢迎。
这是我编写的代码,结合了两个函数:
def split_rec1(str):
if str == "":
return str
elif str[0].islower():
return str[0] + split_rec1(str[1:])
else:
return split_rec1(str[1:])
def split_rec2(str):
if str == "":
return str
elif str[0].isupper():
return str[0] + split_rec2(str[1:])
else:
return split_rec2(str[1:])
def split_rec(str):
return (split_rec1(str), split_rec2(str))
答案 0 :(得分:2)
提醒您可以使用for循环遍历字符串字符,这样:
for c in s: print(c)
将打印每个角色。此外,您可以连接字符串,如:
'c' + 'b' == 'cb'
考虑到这一点:
>>> def split_case(s):
uppers = ''
lowers = ''
for c in s:
if c.isupper(): uppers += c
else: lowers += c
return(uppers,lowers)
会做你想做的事:
>>> split_case("ThisIStheSTRiNg")
('TISSTRN', 'histheig')
然而,这不是递归的。既然是作业,我会把剩下的留给你;)
答案 1 :(得分:1)
你需要你的函数在递归递归时返回两个值(可能在一个元组中)
由于您不想要一个完整的答案,如何才能终止'情况下:
def split_rec(str):
if str == "":
return ("","")
编辑 - 现在已经发布了一个完整的答案,这是我这次没有ROT13编码的完整答案的版本。
def split_rec(str):
if str == "":
return ("","")
up, low = split_rec(str[1:])
if str[0].isupper():
return (str[0]+up,low)
if str[0].islower():
return (up,str[0]+low)
else:
return (up,low)
答案 2 :(得分:1)
您可以使用辅助函数来使元组保持上部套管和下部套管字符串(缩短主要功能):
def addtuple(t1, t2):
return tuple(x[0] + x[1] for x in zip(t1, t2))
这是主要的递归函数(返回(upper, lower)
的元组):
def split_lower_upper(s):
# base case - empty string has no upper/lower case letters
if not s:
return ("", "")
# current character is the first character
c = s[0]
# if it is an uppercase we add it to upper-cased letters
if c.isupper():
return addtuple((c, ""), split_lower_upper(s[1:]))
# if it is an uppercase we add it to lower-cased letters
if c.islower():
return addtuple(("", c), split_lower_upper(s[1:]))
# if it's ont upper/lower case we filter it by ignoring it
return split_lower_upper(s[1:])
提示:请勿shadow str
。它可能会导致最烦人的错误(这只是一个不好的做法)。
答案 3 :(得分:0)
我倾向于喜欢递归解决方案,在每个阶段将问题减半,而不是线性地削弱它。
def split_lower_upper(s):
if len(s) > 1:
mid = int(len(s) / 2)
lower_1, upper_1 = split_lower_upper(s[:mid])
lower_2, upper_2 = split_lower_upper(s[mid:])
return (lower_1 + lower_2, upper_1 + upper_2)
if s.isupper():
return ("", s)
else:
return (s, "")
print(split_lower_upper("tNhIaCtEs")) # => ('thats', 'NICE')