4

私の仕事は、入力として文字列を受け取り、入力文字列が回文であるかどうかを示すブール値を返すプロシージャ is_palindrome を定義することです。この場合、空の文字列と同様に、単一の文字が True を返す必要があります''

残念ながら、期待した結果が得られません。助けてくれてありがとう。

私のコードバージョン1:

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

print is_palindrome('')
#>>> True    (expected = True)

print is_palindrome('abab')
#>>> False    (expected = False)

print is_palindrome('abba')
#>>> None    (expected = True)

print is_palindrome('andrea')
#>>> None    (expected = False)

print is_palindrome('abaaba')
#>>> None    (expected = True)

デバッガーでコードをたどりましたが、コードが適切なパスをたどるので、ロジックは正しいようです。ただし、上記で強調表示されているように、一部のケースでは最終結果が「なし」に切り替わるようです。

コードを次のように変更すると:

私のコードバージョン2:

def is_palindrome(s):
        if s == '':
            result = True
        else:
            if (ord(s[0]) - ord(s[len(s)-1])) == 0:
                is_palindrome(s[1:len(s)-1])
            else:
                result = False
        return result

print is_palindrome('')
#>>> True    (expected = True)

print is_palindrome('abab')
#>>> False    (expected = False)

print is_palindrome('abba')
#>>> Error    (expected = True)
UnboundLocalError: local variable 'result' referenced before assignment 

print is_palindrome('andrea')
#>>> Error   (expected = False)         
UnboundLocalError: local variable 'result' referenced before assignment

print is_palindrome('abaaba')
#>>> Error    (expected = True)
UnboundLocalError: local variable 'result' referenced before assignment
4

6 に答える 6

7

最初の例では、return ステートメントを忘れていました。

def is_palindrome(s):
    if s == '':
        return True
    else:
        if (ord(s[0]) - ord(s[len(s)-1])) == 0:
            # v-- forgot this here
            return is_palindrome(s[1:len(s)-1])
        else:
            return False
于 2012-07-16T00:01:23.960 に答える
4
        is_palindrome(s[1:len(s)-1])

する必要があります...

        return is_palindrome(s[1:len(s)-1])

最初のバージョンで、または

        result = is_palindrome(s[1:len(s)-1])

あなたの秒で。そうしないと、再帰呼び出しの戻り値を元の呼び出し元に実際に伝播することはありません。

于 2012-07-16T00:00:53.633 に答える
3
# ask user to enter any string
a = raw_input("Enter the string : ")
#palindrome check
print (a == a[::-1]) and "String is palindrome" or "String is not palindrome"
于 2013-02-13T09:43:24.110 に答える
2
def is_palindrome(s):
    if not s:
        return True
    else:
        return s[0]==s[-1] and is_palindrome(s[1:-1])

または、ワンライナーが必要な場合:

def is_palindrome(s):
    return (not s) or (s[0]==s[-1] and is_palindrome(s[1:-1]))

それが役立つことを願っています

于 2012-07-16T00:10:20.063 に答える
2

2 番目の例を 1 行ずつ見ていきましょう。

def is_palindrome(s):

この場合、s = "abba" としましょう。これは、エラーが発生した最初の文字列です。

        if s == '':

として評価される

        if 'abba' == '':

これはFalseであるため、スキップして に進みelseます。

        else:
            if (ord(s[0]) - ord(s[len(s)-1])) == 0:

このifステートメントは次と同等です。

            if (97 - 97) == 0:

Trueあるため、再帰が発生します。

                is_palindrome(s[1:len(s)-1])

また

                is_palindrome('bb')

この再帰の結果が何であれ、戻り値が保存されないため、無視します。したがって、この行に到達すると:

        return result

何が何であるかを定義したことがないresultため、Python がひっくり返ります。

他の投稿者は、すでにあなたの質問に素晴らしい回答をしています。プログラムをトレースしてバグを見つけて修正することの重要性を示すために投稿しています。

于 2012-07-16T00:11:57.033 に答える