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

于 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 に答える