我想使用递归来反转python中的字符串,以便向后显示字符(即“Hello”将变为“olleh”/“o l l e h”。
我写了一个迭代地做的:
def Reverse( s ):
result = ""
n = 0
start = 0
while ( s[n:] != "" ):
while ( s[n:] != "" and s[n] != ' ' ):
n = n + 1
result = s[ start: n ] + " " + result
start = n
return result
但我究竟如何递归地做到这一点?我对此部分感到困惑,特别是因为我不使用python和递归。
任何帮助都将不胜感激。
答案 0 :(得分:19)
为了递归地解决问题,找到一个易于解决的简单案例,并通过将问题分解为更简单和更简单的版本来弄清楚如何解决这个简单的案例。
你在倒转字符串时做的第一件事是什么?从字面上看第一件事?你得到字符串的最后一个字符,对吗?
所以字符串的反转是最后一个字符,后面是所有的反向,但是最后一个字符,这是递归的来源。字符串的最后一个字符可以写成x[-1]
所有但最后一个字符为x[:-1]
。
现在,你如何“走出低谷”?也就是说,如果没有递归,你能解决的琐碎案例是什么?一个答案是单字符串,它是相同的正向和反向。所以,如果你得到一个单字符串,你就完成了。
但是空字符串更加微不足道,有人可能会将其传递给您的函数,因此我们应该使用它。毕竟,一个字符的字符串可以也分解为最后一个字符和除最后一个字符之外的所有字符;只是除了最后一个字符之外的所有字符都是空字符串。因此,如果我们通过返回它来处理空字符串,那么我们就设置了。
把它们放在一起然后得到:
def backward(text):
if text == "":
return text
else:
return text[-1] + backward(text[:-1])
或者在一行中:
backward = lambda t: t[-1] + backward(t[:-1]) if t else t
正如其他人所指出的,这不是你通常在Python中这样做的方式。迭代解决方案会更快,使用切片来实现它会更快。
此外,Python对堆栈大小施加了限制,并且没有尾调用优化,因此递归解决方案仅限于反转大约一千个字符的字符串。您可以增加Python的堆栈大小,但仍然存在固定限制,而其他解决方案始终可以处理任意长度的字符串。
答案 1 :(得分:18)
def rreverse(s):
if s == "":
return s
else:
return rreverse(s[1:]) + s[0]
(很少有人在Python中使用语言wasn't designed for it进行繁重的递归处理。)
答案 2 :(得分:4)
如果这不仅仅是一个家庭作业问题,并且您实际上是在尝试将字符串转换为更大的目标,那么只需执行s[::-1]
。
答案 3 :(得分:1)
def reverse_string(s):
if s: return s[-1] + reverse_string(s[0:-1])
else: return s
或
def reverse_string(s):
return s[-1] + reverse_string(s[0:-1]) if s else s
答案 4 :(得分:0)
我知道现在回答原始问题为时已晚,这里已经有多种更好的方法可以回答我了。我的回答是出于文档目的,以防万一有人尝试对字符串反向实现尾部递归。
def tail_rev(in_string,rev_string):
if in_string=='':
return rev_string
else:
rev_string+=in_string[-1]
return tail_rev(in_string[:-1],rev_string)
in_string=input("Enter String: ")
rev_string=tail_rev(in_string,'')
print(f"Reverse of {in_string} is {rev_string}")
答案 5 :(得分:0)
我只想根据Fred Foo的回答添加一些解释。 假设我们有一个名为'abc'的字符串,我们想返回它的反向字符,应该为'cba'。
def reverse(s):
if s == "":
return s
else:
return reverse(s[1:]) + s[0]
s = "abc"
print (reverse(s))
此代码的工作原理是: 当我们调用函数
reverse('abc') #s = abc
=reverse('bc') + 'a' #s[1:] = bc s[0] = a
=reverse('c') + 'b' + 'a' #s[1:] = c s[0] = a
=reverse('') + 'c' + 'b' + 'a'
='cba'
答案 6 :(得分:0)
s = input("Enter your string: ")
def rev(s):
if len(s) == 1:
print(s[0])
exit()
else:
#print the last char in string
#end="" prints all chars in string on same line
print(s[-1], end="")
"""Next line replaces whole string with same
string, but with 1 char less"""
return rev(s.replace(s, s[:-1]))
rev(s)