3

回文は、同じ前方と後方を読み取る文字列です。回文の例には、「lol」、「abba」、「radar」、および「pickleelkci​​p」が含まれます。次のdocstringで説明されているすべての状況で機能するかどうかを示します。''''文字列sが回文の場合はTrueを返し、それ以外の場合はFalseを返します。'''

def palindrome2(s):
    n = len(s)
    pal = True
    for i in range(n/2):
        if s[i] == s[n-i-1]:
            pal = True
        else:
            pal = False
    return pal

この機能が機能しない理由がわかりません。私には、この機能が機能しているように見えます。どうやら、ブール値は誤用されているようですが、上記のブール値が適切に使用されていない方法がわかりません。誰かが私にこれを説明してもらえますか?

4

4 に答える 4

8

楽しみのために、もっと簡単に試すこともできます:

def palindrome(s):
  return s[::-1] == s

(それがどのように機能するかについては読者に残された演習)

于 2012-04-24T01:22:16.197 に答える
6

ループの本体がコード化される方法は、その特定の反復中に特定の文字のペアがたまたま一致するかどうかに応じて、とpalの間Trueで繰り返し変化する可能性があります。False

不等式をチェックし、ブール変数palをに設定Falseして、すぐにループから抜け出すことをお勧めします。

このようなもの:

def palindrome2(s):
    n = len(s)
    pal = True

    for i in range(n/2)
        if s[i] != s[n-i-1]: # the moment it's false
           pal = False       # set pal and
           break             # drop out of the loop

    return pal

または、ブール変数を使用せずに:

    ...
    for i in range(n/2)
        if s[i] != s[n-i-1]: # the moment it's false
           return False      # exit the function by returning False

    return True  # otherwise return True
于 2012-04-24T01:17:48.193 に答える
3

常にすべての文字をチェックします。結果が確定したらすぐに戻る必要があります。

于 2012-04-24T01:17:29.893 に答える
3

@ulmangtの解決策は非常に巧妙ですが、あまり謎めいたものではありません。

def palindrome(s):
    return all(( s[i] == s[-(i+1)] for i in range(len(s)/2) ))

少なくとも半分の比較を行います;-)

于 2012-04-24T01:42:27.997 に答える