def is_palindrome(s):
if s == ' ':
return True
if s[0] != s[-1]:
return False
return is_palindrome(s[1:-1])
这是我的代码,但不起作用。 它适用于诸如abab之类的情况,但不适用于abba。 谁能告诉我为什么?
答案 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()
。