-1
def is_palindrome(s):

    if s == ' ':
        return True

    if s[0] != s[-1]:
        return False

    return is_palindrome(s[1:-1])

这是我的代码,它不起作用。它适用于诸如 abab 之类的情况,但不适用于 abba。谁能告诉我为什么?

4

4 回答 4

3
def is_palindrome(s): 
  return s == s[::-1]

如果您担心字符串,可以使用迭代器:

def is_palindrome(xs):
  return all( imap( lambda a,b: a == b, iter(xs), reversed(xs)) )      
于 2012-12-30T11:58:01.857 回答
3

如果必须使用递归,请使用更好的终止子句:

def is_palindrome(s):
    if len(s) <= 1:
        return True
    if s[0] != s[-1]:
        return False
    return is_palindrome(s[1:-1])

因此,当您的字符串减少到 1 或 0 个字符时,您就有了回文。

这给出了:

>>> is_palindrome('abba')
True
>>> is_palindrome('palindrome')
False
>>> is_palindrome('aba')
True

您最初的错误是测试空格,而s被缩减为字符串。测试 fors == ''也可以,但由于单字符字符串也有资格作为回文,您不妨将其设为显式终止测试。

于 2012-12-30T12:00:49.360 回答
1
def is_palindrome(s):
    if s == '':  # <-- See this change, '' instead of ' '
        return True
    if s[0] != s[-1]:
        return False
    return is_palindrome(s[1:-1])


>>> is_palindrome('')
True
>>> is_palindrome('a')
True
>>> is_palindrome('aba')
True
>>> is_palindrome('abba')
True
>>> is_palindrome('abcba')
True
>>> is_palindrome('abcbac')
False
>>> is_palindrome(' ')
True
>>> is_palindrome('able was i ere i saw elba')
True

不过,这根本不是一个好的实现。你应该尝试不同的方法。

于 2012-12-30T11:59:08.890 回答
1

像这样的东西应该有效地处理大量输入(以及测试值直到中间):

from itertools import islice, izip

def is_palindrome(s):
    middle = len(s) // 2
    return all(i[0] == i[1] for i in islice(izip(s, reversed(s)), middle + 1))

在 Python 3 中,您可以只替换izip()zip().

于 2012-12-30T12:05:22.680 回答