web-dev-qa-db-ja.com

回文をチェックするこの関数のバグはどこにありますか?

以下に、リストが回文であるかどうかを確認するためのコードを示します。 983の正しい出力を提供しています。どこが間違っているのですか?

def palindrome(num):
    flag=0
    r=num[::-1]
    for i in range (0, len(num)-1):
        if(r[i]==num[i]):
            flag=1
        else:
            flag=0
    return flag

不一致があるとすぐに戻る必要があります。また、半分の長さまで繰り返す必要があります。

def function(...):
    ...
    for i in range (0, (len(num) + 1) / 2):
        if r[i] != num[i]:
            return False
    return True

ところで、そのループは必要ありません。あなたは簡単に行うことができます:

def palindrome(num):
    return num == num[::-1]
22
Rohit Jain

これは簡単です:

def palindrome(num):
    if num[::-1] == num:
       return True
    else:
       return False
4
Synthetica

forループは、不一致が見つかったかどうかに関係なく、文字のすべてのペアをチェックします。したがって、文字列「38113」の場合、「38113」の最後の桁が等しいかどうかをチェックした後、True変数がflagに設定されるため、Trueが返されます。そしてその逆バージョン「31183」(文字列は回文ではありませんが、両方とも3に等しい)。
したがって、不一致を見つけた直後にFalseを返す必要があります。すべての文字をチェックしても見つからなかった場合は、次のようにTrueを返します。

def palindrome(num):
    r = num[::-1]
    for i in range (0, len(num)-1):
        if(r[i] != num[i]):
            return False
    return True  

また、誰かが指摘したように、Pythonのスライスを使用する方が良いでしょう- ドキュメント をチェックしてください。

1
aga

ここに私の意見では最もエレガントです:

def is_palindrome(s):
    if s != '':
        if s[0] != s[-1]:
            return False
        return is_palindrome(s[1:-1])
    return True

is_palindrome()関数のコードも同じです。

pip install is-palindrome


>>> from is_palindrome import is_palindrome
>>> x = "sitonapanotis"
>>> y = is_palindrome(x)
>>> y
True

インストールとインポートの際には、ハイフンとアンダースコアに注意してください。

0
user10364045

これははるかに簡単です:

def palindrome(num):
    a=num[::-1]
    if num==a:
        print (num,"is palindrome")
    else:
        print (num,"is not palindrome")

x=input("Enter to check palindrome:")
palindrome(x)
0
user8211857
str1=str(input('enter string:'))
save=str1
revstr=str1[::-1]
if save==revstr:
     print("string is pailandrom")
else:
     print("not pailadrom")
0
ankita

記録のために、そして与えられた文字列が回文であるかどうかを検証するためのよりアルゴリズム的な方法を探している人のために、同じことを達成するための2つの方法(whileforループを使用):

def is_palindrome(Word):

    letters = list(Word)    
    is_palindrome = True
    i = 0

    while len(letters) > 0 and is_palindrome:       
        if letters[0] != letters[-1]:
            is_palindrome = False
        else:
            letters.pop(0)
            if len(letters) > 0:
                letters.pop(-1)

    return is_palindrome

そして.... 2番目のもの:

def is_palindrome(Word):

    letters = list(Word)
    is_palindrome = True

    for letter in letters:
        if letter == letters[-1]:
            letters.pop(-1)
        else:
            is_palindrome = False
            break

    return is_palindrome
0
# We are taking input from the user.
# Then in the function we are reversing the input i.e a using 
# slice     [::-1] and 
# storing in b
# It is palindrome if both a and b are same.

a = raw_input("Enter to check palindrome:") 
def palin():
    #Extended Slices to reverse order.
    b = a[::-1]
    if a == b:
        print "%s is palindrome" %a
    else:
        print "%s is not palindrome" %a
palin()
0
Anupam Thakur