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
文字列に縮小されています。のテストも機能しますが、1 文字の文字列も回文としての資格があるため、明示的な終了テストを行うこともできます。s == ''
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()
ます。