2016-04-18 4 views
1

私はPython(またはプログラミング)には新しく、再帰を学習しようとしています。文章がPythonで回文であるかどうかを確認するより良いアプローチ

私は再帰的なpython関数を書いて、文章(単語ではない)が回文かどうかを調べました。

def checkPalindrome(sentence): 
    sentence = re.sub('[^\w]', '', sentence.lower()) 
    if len(sentence) == 1: 
     return True 
    elif len(sentence) == 2: 
     return sentence[0] == sentence[1] 
    else: 
     return checkPalindrome(sentence[1:-1]) 

この関数は機能し、正しい結果を提供します。例:

checkPalindrome('Go hang a salami; I’m a lasagna hog') 
True 

しかし、私はスペース、句読点を削除し、関数の先頭に文の場合を変えるておりますので、このステップは、すべての再帰呼び出しで計算されます。

これを回避するには、関数を書き直す方法がありますか?

+1

小文字の句読点のない文字列を単に "渡す"機能を定義することができます。あるいは単に 'sentence'を正しい値として開始してください。 –

+2

'QQ'キャラクタがこのようにする最後の2つの文字の等価性をチェックしているので、関数' 'randomtextQQdsfdfdfs''を' 'True''を返すなど、関数は機能しません"palindrome" true – Pythonista

+2

あなたのロジックはここで間違っていると思う...それは2つの中間の文字が同じである限り、それはpalindromだと思うだろう(途中で任意の文字で)... @Pythonistaはそれに私を打つ –

答えて

2

私はちょうどあなた自身の問題に答えたと思います:入力を小文字に減らし、2番目の文字を呼び出す1つの関数を書いてください。この2番目の関数は回文チェックと再帰を行います。

しかし、関数が動作しないことに注意してください:最後の文字を互いに照合する唯一の時間は、len(sentence)== 2の基本ケースです。再帰呼び出しの直前にチェックする必要があります。あまりに:Joranの提案@当たりに編集

if len(sentence) <= 1: 
    return True 

:この与えられた

else: 
    return sentence[0] == sentence[-1] and 
      checkPalindrome(sentence[1:-1]) 

、また、あなたの2のベースケースを組み合わせることができます。私は最近、あまりにも多くのコンパイラの最適化を行ってきました。私のオリジナルはPythonの言語定義によって保証されていません。このアップデートは、一般的な場合にはうまくいくでしょう。

+3

良い答え...再帰的なチェックポイントがないので、おそらく 'return s [0] == s [-1]とcheckPalindrome(s [1:-1])'少なくとも2セントです。 's [0]!= s [-1] '(+1) –

+0

あなたの答えはありがとうございました。私はそれが今どのようにする必要があるかを見ます。 –

関連する問題