Python使用递归反转字符串

Python使用递归反转字符串,python,string,recursion,Python,String,Recursion,我想使用递归来反转python中的字符串,以便它向后显示字符(即“Hello”将变成“olleh”/“o l e h”) 我写了一个迭代的例子: def Reverse( s ): result = "" n = 0 start = 0 while ( s[n:] != "" ): while ( s[n:] != "" and s[n] != ' ' ): n =

我想使用递归来反转python中的字符串,以便它向后显示字符(即“Hello”将变成“olleh”/“o 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和递归


任何帮助都将不胜感激。

如果这不仅仅是一个家庭作业问题,而且您实际上是为了更大的目标而试图颠倒字符串,只需执行
s[:-1]

def rreverse(s):
    if s == "":
        return s
    else:
        return rreverse(s[1:]) + s[0]

(很少有人用Python这种语言进行繁重的递归处理。)

要递归地解决问题,找到一个简单易解的小案例,并找出如何通过将问题分解为越来越简单的版本来解决这个小案例

反转字符串的第一件事是什么?确切地说是第一件事?你得到字符串的最后一个字符,对吗

因此字符串的倒数是最后一个字符,然后是除最后一个字符以外的所有字符的倒数,这就是递归的作用。字符串的最后一个字符可以写成
x[-1]
,而除最后一个字符以外的所有字符都是
x[:-1]

def rreverse(s):
    if s == "":
        return s
    else:
        return rreverse(s[1:]) + s[0]
现在,你如何“自下而上”?也就是说,没有递归你能解决的简单情况是什么?一个答案是一个字符串,它是相同的正向和反向。因此,如果你得到一个一个字符串,你就完成了

但空字符串更为琐碎,有人可能会将其传递给函数,因此我们可能应该使用它。毕竟,一个单字符字符串也可以分解为最后一个字符和除最后一个字符以外的所有字符;只是除了最后一个字符以外的所有字符都是空字符串。所以如果我们只需返回空字符串,就可以删除空字符串

把这些放在一起,你会得到:

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对堆栈大小施加了限制,并且没有尾部调用优化,因此递归解决方案仅限于反转大约1000个字符的字符串。您可以增加Python的堆栈大小,但仍然有固定的限制,而其他解决方案始终可以处理任意长度的字符串

def reverse_string(s):
    if s: return s[-1] + reverse_string(s[0:-1])
    else: return s


我知道现在回答最初的问题已经太迟了,这里已经回答了很多更好的方法。我的回答是为了文档目的,以防有人试图为字符串反转实现尾部递归

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

我只是想补充一些解释的基础上。 假设我们有一个名为“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'

有趣的事实:这有时被称为“火星微笑”。
reversed()。join([i for i in reversed(s)]按您认为的方式执行,reversed返回一个反向对象,您必须对其进行迭代才能返回字符串。问题明确表示他们希望使用“递归”来解决问题。好的,这是可行的,但底部部分到底是如何工作的?您正在对字符串的第一个元素调用函数rreverse,并打印出第0个元素。rreverse(s[1:])每次是如何递增的?@Eric递归调用是从第二个元素开始对s的子字符串进行的(例如,s[1:]给出的s没有第一个元素)。然后,他将递归调用的结果附加到s的第一个字符,例如s[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)