0

这是我的简单代码。

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', newStr='l', newStr='a', newStr=''. 我不明白。为什么它会这样?

4

4 回答 4

3

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

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

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

例子:

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

>>> reverseString('racecar')
'racecar' # See what I did there ;)
于 2013-06-10T11:40:29.513 回答
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 . 
于 2013-06-10T11:28:20.510 回答
-1

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

>>> ''.join(reversed("abcd"))
'dcba'
于 2013-06-10T11:56:18.700 回答
-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 的回答。

于 2013-06-10T11:28:23.260 回答