2016-04-10 5 views
0

編集:注:アルファベットの一部ではない文字はすべて無視することになっています。Python:入力したテキストがパブリドームかどうかを確認する再帰関数を作成しようとしています

def is_palindrome(text): 
    ''' 
    A Recursive Function that returns True if the parameter, text, is a palindrome, False if not. 
    Ignores capitalization, punctuation, and spaces. 

    text: a String 
    returns True or False 
    ''' 
    text = list(text) 
    if len(text) == 0: 
     return True 
    else: 
     if text[0] == ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]: 
      if text[-1] == ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]: 
       if text[0].lower() == text[-1].lower(): 
        text.remove(text[0]) 
        text.remove(text[-1]) 
        return is_palindrome(text) 
       else: 
        return False 
      else: 
       text.remove(text[-1]) 
       return is_palindrome(text) 
     else: 
      text.remove(text[0]) 
      return is_palindrome(text) 

私は「もし」ステートメントの前に印刷(テキスト)を行うことで、「テキスト」変数のprint文を入力してデバッグしようとしました。

これらは私がテストケースをしようとした場合、is_palindrome(「AABBCC」)

aabbcc 
['a', 'b', 'b', 'c', 'c'] 
['b', 'b', 'c', 'c'] 
['b', 'c', 'c'] 
['c', 'c'] 
['c'] 
[] 

取得結果であるので、それはテキストのみ」にスキップすることによって、リストの最初の項目を毎回削除しているようです.remove(text [0]) "最後のelseステートメントで。

どうすればこの問題を解決できますか?思考?

+0

あなたは、アレイ全体に単一のアレイ項目を比較します?比較する際には、チェックインと同等のものを使用してみてください。 – Brody

+0

ええ、問題は、単一項目を配列全体と比較することです。ありがとう! –

答えて

0

あなたは文字列のリストと等しいかどうかをチェックしている:

焦がす文字が行の文字のリストと同等であればあなたがチェックしている:

if text[0] == ['A', ....] 

それはこれを渡していません最初の項目を削除するelseステートメントに進みます。あなたはそれを繰り返す必要はありませんので、あなたがリストに変数を文字列をインポートし、ちょうどあなたのコードいくつかを簡素化するためにstring.asciiにtext[0]かどうかを確認、または作ることができますが

あなたは

if text[0] in ['A', '''] 

をチェックする必要があります二度。すぐに失敗しようとしている -

さらに簡単、あなたが実際に文字のリスト全体に文字を比較しているif text[0].isalpha()

+0

のうちリストインデックス:私は is_palindromeをしようとすると、それは (「悪にないライブ」)、テストケースのために働く is_palindrome(「アーティチョーク」)----> Falseの しかし、それは私にはIndexErrorを与えます範囲 –

+1

または 'if text [0] .isalpha()'を使用してください。 – zondo

+0

良い点、 'isalpha'はもっと簡単にここに行く方法です。完全にそれを逃した。 – Pythonista

1

を使用しています。あなたがあなた自身のコードを記述する必要がある場合は

は:また

def is_ascii(c): 
    # yes, python allows you to write it like this: 
    return ('a' <= c <='z') or ('A' <= c <='Z') 

stringlistに変換する必要はありません。

def is_palindrome(text): 
    # your condition for palindrome was also wrong: 
    # "foof" would end up with len(text)==0 
    # "pap" is also palindrome and ends up with len(text)==1 
    if len(text)<2: 
    return True 

    # you don't have to modify the text before passing it to the next iteration 
    # (uses Python `slicing`) 
    if not is_ascii(text[0]): 
    return is_palindrome(text[1:]) 
    if not is_ascii(text[-1]): 
    return is_palindrome(text[:-1]) 
    # both end characters are ascii 
    if text[0].lower()==text[1].lower(): 
    # recurse with remaining characters 
    return is_palindrome(text[1:-1]) 
    # not a palindrome 
    return False 
関連する問題