这是我的简单代码。
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'
。我不明白。为什么它会像这样?
答案 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'