【问题标题】:Writing a string backwards向后写一个字符串
【发布时间】:2013-06-06 00:59:27
【问题描述】:

这是我的简单代码。

def reverseString(aStr):
    newStr = ''
    if len(aStr) == 0:
        return newStr
    else:
        newStr = newStr + aStr[len(aStr)-1]
        return reverseString(aStr[:len(aStr)-1])

对于'alina'(如果我在return reverseString... 之前插入print newStr),输出为:newStr='a'newStr='n'newStr='i'newStr='l'newStr='a'newStr=''。我不明白。为什么会这样?

【问题讨论】:

  • aStr[len(aStr)-1]aStr[-1]
  • aStr[::-1] 怎么样?
  • 使用扩展切片:aStr[::-1] 这将修复它对你有好处。
  • 或者你可以使用reversed()函数newStr = ''.join(reversed(aStr))(和扩展切片一样,但是更优雅)
  • 也见this question

标签: python string recursion


【解决方案1】:

类似这样的:

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 . 

【讨论】:

  • 为什么不默认选择newStr = ''
  • @Elazar 好点子,我忘了字符串在 python 中是不可变的。
【解决方案2】:

您正在返回递归调用的结果,而不保留之前调用的信息。你有这行:

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 的答案。

【讨论】:

  • 谢谢!问题是我从未返回 newStr。
  • -1 强制在不适合执行此操作的编程语言中使用递归。它是 Python,而不是 Haskell。
  • @doukremt 谢谢。这种执行是 OP 的(所谓的“CS 练习”),不是我的,但你的观点很明确。
【解决方案3】:

你的函数没有工作的原因是你忘了在最后返回newStr。每次调用函数时,newStr 都会重置为 ''

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

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

例子:

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

>>> reverseString('racecar')
'racecar' # See what I did there ;)

【讨论】:

  • 问题是“为什么会这样?”。这是评论,不是答案。
【解决方案4】:

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

>>> ''.join(reversed("abcd"))
'dcba'

【讨论】:

  • 只是说,这是这里第 6 次提出这个解决方案。这是评论,而不是答案,并且已经被建议了。
  • 是的,但我是一名试图学习编程的兽医,所以我必须先了解一些事情...... :)
  • @Elazar:除了我的回答之外,我没有看到此页面中提到此方法。
  • 查看 zmo 和 Schorsch 的 cmets。
  • @doukremt 有两个已删除的答案,您看不到哪个已经暗示了这一点;其中一位撰写这些答案的用户对该问题添加了评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2018-05-09
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多