识别回文的代码

时间:2012-12-30 11:53:34

标签: python

def is_palindrome(s):

    if s == ' ':
        return True

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

    return is_palindrome(s[1:-1])

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

4 个答案:

答案 0 :(得分: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)) )      

答案 1 :(得分: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则缩减为字符串。对s == ''的测试也可以,但由于单字符字符串也可以作为回文,因此您也可以进行明确的终止测试。

答案 2 :(得分: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

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

答案 3 :(得分: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()