递归分割功能

时间:2015-11-16 22:51:47

标签: python string recursion

我正在尝试编写一个带字符串并将其分成两个字符串的函数。第一个应该只包含小写字母,第二个只包含大写字母。

我已经提出了一个有效的解决方案,但我希望能够只有一个函数只能通过字符串一次。我现在已经尝试了整整一天,但未能提出解决方案,所以我想要一些帮助。

棘手的部分是我必须使用递归来做到这一点。 我已经提出了一个非常简单的迭代解决方案,但如前所述,我必须以递归方式执行此操作。

这是一项家庭作业,所以我不是在寻找某人为我做这份工作,但是一些提示和解释会非常受欢迎。

这是我编写的代码,结合了两个函数:

    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))

4 个答案:

答案 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')