0
def func_palindrome(stri):
    if len(stri) == 0 or 1:
        return True
    if stri[0] != stri[-1]:
        return False
    return func_palindrome(stri[1:-1])

文字列が回文であるかどうかをチェックするこの関数が、再帰コードと見なされるかどうかはわかりません。それは、最後の戻り値return func_palindrome(str[1:-1])を True に変更するだけで何も変わらないからです

4

3 に答える 3

7

あなたの問題はここにあります:

if len(str) == 0 or 1 :

する必要があります

if len(str) == 0 or len(str) == 1:

実行するだけで、次のように解釈されるため、常にif len(str) == 0 or 1評価されますTrue (len(str) == 0) or 1

また、組み込み型のstrように、別の名前に変更しますstr

于 2013-11-08T22:10:15.623 に答える
1

これを再帰的に行う必要はありませんが、多くの余分なスペースと長い文字列のパフォーマンスの低下を気にしない場合は特に可能です。

以下に、2 つの非再帰的な方法を示します。

#!/usr/bin/python3

def is_palindrome1(string1):
    string2_list = list(string1)
    string2_list.reverse()
    string2 = ''.join(string2_list)
    return string1 == string2

def is_palindrome2(string):
    len_string = len(string)
    for index in range(len_string // 2):
        character1 = string[index:index+1]
        character2 = string[len_string-index-1:len_string-index]
        if character1 == character2:
            # This character is good
            pass
        else:
            return False
    # all characters matched
    return True

for string in [ '393', '339', 'aibohphobia', 'aibobphobia' ]:
    assert is_palindrome1(string) == is_palindrome2(string)
    print(is_palindrome1(string))
    print(is_palindrome2(string))
于 2013-11-08T22:28:50.117 に答える
1

自分自身を呼び出す関数は、技術的には再帰関数です。

引数を「基本ケース」でチェックし、それ以外の場合は引数の「より小さい」バージョンで自分自身を呼び出す関数は、便利な再帰関数です。

もちろん、再帰関数は依然として壊れている可能性があり、無意味でさえあります。たとえば、次の関数を考えてみましょう。

def recursive_length(a):
    if not a:
        return 0
    return 0 + recursive_length(a[1:])

最後の行の愚かなバグは、これが再帰関数ではないという意味ではありません。0数値の N 個のコピーではなく、数値の N 個のコピーを再帰的に合計している1ので、 と書くだけで同じことができますreturn 0。しかし、これは の N 個のコピーの合計0が always0であるためであり、関数が再帰的ではないからではありません。

では、基本ケースに問題があった場合はどうなるでしょうか。

def recursive_length(a):
    if a is not None:
        return 0
    return 1 + recursive_length(a[1:])

実際に再帰することはありませんが、再帰関数であることには変わりありません。これは、基本ケースにバグがある単なる再帰関数です。

于 2013-11-08T22:21:37.593 に答える