def is_palindrome(s):
if s == ' ':
return True
if s[0] != s[-1]:
return False
return is_palindrome(s[1:-1])
这是我的代码,它不起作用。它适用于诸如 abab 之类的情况,但不适用于 abba。谁能告诉我为什么?
def is_palindrome(s):
if s == ' ':
return True
if s[0] != s[-1]:
return False
return is_palindrome(s[1:-1])
这是我的代码,它不起作用。它适用于诸如 abab 之类的情况,但不适用于 abba。谁能告诉我为什么?
def is_palindrome(s):
return s == s[::-1]
如果您担心大字符串,可以使用迭代器:
def is_palindrome(xs):
return all( imap( lambda a,b: a == b, iter(xs), reversed(xs)) )
如果必须使用递归,请使用更好的终止子句:
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 == ''
也可以,但由于单字符字符串也有资格作为回文,您不妨将其设为显式终止测试。
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
不过,这根本不是一个好的实现。你应该尝试不同的方法。
像这样的东西应该有效地处理大量输入(以及测试值直到中间):
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()
.