【问题标题】:Reversing a String recursively in Python在 Python 中递归地反转字符串
【发布时间】:2020-07-09 14:04:20
【问题描述】:

我正在尝试在 Python 中递归地反转字符串,但是,此解决方案不起作用

def reverseString(self, s):
    """
    :type s: List[str]
    :rtype: None Do not return anything, modify s in-place instead.
    """
    if len(s) == 0:
        return s
    s[0], s[-1] = s[-1], s[0]
    self.reverseString(s[1:-1])

对于样本输入 ["h","e","l","l","o"],我得到输出 ["o","e","l","l", “H”]。谁能解释为什么这不起作用?

【问题讨论】:

标签: python string recursion


【解决方案1】:
def reverse(s): 
    if len(s) == 0: 
        return s 
    return reverse(s[1:]) + s[0]

您的基本条件是正确的。但是,您的递归调用很复杂且不正确。

【讨论】:

    【解决方案2】:

    您的代码的问题是reverseString(s[1:-1]) 创建了列表的新副本,而您对此所做的操作对当前递归级别的列表没有影响。

    您可以通过交换第一个和最后一个字符并反转内部部分来重构字符串并从每个级别返回:

    def reverseString(s):
        if len(s) <= 1:
            return s
        return s[-1] + reverseString(s[1:-1]) + s[0]
    
    print(reverseString('hello'))
    

    输出:

    olleh
    

    【讨论】:

      【解决方案3】:
      s[0], s[-1] = s[-1], s[0]
      

      这会修改输入列表。看来您的意图是用给定的调用交换输入中的两个值,并使用递归来覆盖每对所需的值。

      self.reverseString(s[1:-1])
      

      这对新创建的列表进行递归调用,并忽略结果。它确实不会从原始列表中交换更多内容。

      没有理由就地修改输入。它不是一个简单的解决方案,它限制了您可以处理的序列类型。通常,您希望递归函数生成新值,而无需理会它们的输入 - 以这种方式推理它们要容易得多。 (此外,您还可以自动处理字符串和元组。)

      一个简单的方法是:我们认识到输入的第一个字符应该在输出的最后,然后我们可以通过反转输入的其余部分来获得字符串的其余部分——我们可以通过递归来实现调用其余的输入。这自然会导致@HarshalParekh 的解决方案。

      【讨论】:

        【解决方案4】:
        def reverse(s):
            if len(s) == 0:
                return ""
            return s[-1] + reverse(s[:-1])
        
        s = ["h","e","l","l","o"]
        
        [letter for letter in reverse(s)] # prints ['o', 'l', 'l', 'e', 'h']
        
        

        你试图交换第一个和最后一个元素,然后是第二个和最后一个元素,依此类推。您还应该考虑存在奇数个元素的情况,您最终会得到只有 1 个元素的基本情况,因此您需要包含 len(s) == 0 or len(s)==1 的基本情况。

        我已在下面修复了您的代码:

        def reverse(s):
            if len(s) == 0 or len(s)==1:
                return s
            return s[-1] + reverse(s[1:-1]) + s[0]
        
        [item for item in reverse(''.join(s))] # prints ['o', 'l', 'l', 'e', 'h']
        
        

        【讨论】:

          猜你喜欢
          • 2013-09-27
          • 2014-06-10
          • 2011-07-28
          • 2017-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多