向后写一个字符串

时间:2013-06-10 11:22:39

标签: python string recursion

这是我的简单代码。

def reverseString(aStr):
    newStr = ''
    if len(aStr) == 0:
        return newStr
    else:
        newStr = newStr + aStr[len(aStr)-1]
        return reverseString(aStr[:len(aStr)-1])

对于'alina'(如果我在print newStr之前插入return reverseString...),则输出为:newStr='a'newStr='n'newStr='i',{{ 1}},newStr='l'newStr='a'。我不明白。为什么它会像这样?

4 个答案:

答案 0 :(得分:3)

您的功能无效的原因是您忘记最后返回newStr。每次调用您的函数时,newStr都会重置为''

有一种更简单的方法来做你正在做的事情。使用slicing

def reverseString(s):
    return s[::-1]

示例:

>>> reverseString('alina')
'anila'

>>> reverseString('racecar')
'racecar' # See what I did there ;)

答案 1 :(得分:0)

这样的事情:

def reverseString(aStr, newStr = ''):
    if len(aStr) == 0:
        return newStr
    else:
        newStr = newStr + aStr[-1]  #-1 returns the last element from the string
        return reverseString(aStr[:-1], newStr) #slice the string up to second last char
print reverseString("foobar")     
#raboof

您的代码的问题是newStr在每个递归循环中被重新分配为空字符串(''),您必须在每个递归调用中传递newStr值。

def reverseString(aStr, newStr= ''): #define a default value for newStr

    if len(aStr) == 0:
        return newStr
    else:
        newStr = newStr + aStr[len(aStr)-1]  #better use aStr[-1]
        return reverseString(aStr[:len(aStr)-1], newStr) #pass the new value of newStr

print reverseString("foobar")# No value is passed for newStr. So, default is used . 

答案 2 :(得分:-1)

您正在返回递归调用的结果,而不保留先前调用的信息。你有这一行:

newStr = newStr + aStr[len(aStr)-1]

然后丢弃newStr。

可能的解决方案:

def reverseString(aStr):
    if len(aStr) == 0:
        return ''
    else:
        return aStr[-1] + reverseString(aStr[:-1])

或只是

def reverseString(s):
    return s[-1]+reverseString(s[:-1]) if s else ''

请注意,这两种解决方案都很优雅,但是“正常”递归,因此不是最理想的;对于尾递归解决方案(可能优化为循环),请参阅@Ashwini Chaudhary的回答。

答案 3 :(得分:-1)

只是说',有一种更简单的方法可以做到这一点,这避免了递归及其带来的问题:

>>> ''.join(reversed("abcd"))
'dcba'