再帰関数から「抜け出す」ことはありません。そうしようとすると、あなたはそれらについて間違った方法で考えていると言います。現在、再帰呼び出しは出力を無視しています。これは、再帰が無意味であることを意味します。戻りis_pal(middle(str))
値は、関数の戻り値には影響しません。
再帰的アルゴリズムは、問題をより小さな問題に分解し、より小さな問題の解を再帰的に取得し、より小さな解を使用してより大きな問題の正しい解を構築することにより、入力問題を解決します。内部呼び出しから「抜け出す」のではなく、ソリューションを1レベル戻します。内線通話かトップレベル通話かはわかりません(または知る必要があります)。どちらの場合でも、関数は同じことを行う必要があります。True
引数が回文である場合は戻り、False
そうでない場合は戻ります。
実装しようとしているアルゴリズムは基本的に次のとおりです。
- 文字列の長さが1の場合、それは回文です(return
True
)
- それ以外の場合、最初の文字が最後の文字と同じである場合、中央の文字が回文であれば、入力は回文になります。
つまり、最初と最後の文字が同じであることを確認すると、「私の入力は回文です」に対する答えは、「中間の文字は回文です」に対する答えとまったく同じになります。契約を履行するには、その回答を返す必要があります。したがって、再帰呼び出しはreturn is_pal(middle(str))
単なるではなくする必要がありますis_pal(middle(str))
。これがトップレベルの呼び出しだった場合、それが答えです。これがトップレベルの呼び出しではなかった場合、外部の呼び出しは、外部の問題に対する答えを見つけるためにこの答えを必要とします(この場合、単にそれを返すことによって)。
ところで、あなたのアルゴリズムには他にもいくつか問題があります。
戻ることはないFalse
ので、答えは決してありません(この場合、最初と最後の文字が一致しない場合、関数の最後から落ちFalse
て誤って戻ることがあり、ほとんどの場合、代用として機能します、しかしそれはまだ実際には正しくありません)。None
None
False
文字列の長さが1ではなくゼロの場合(空の文字列が渡された場合、または同じ長さの最初と最後の文字のすべてのペアが削除された後に同じ長さの回文が渡された場合に発生します)、正解を返します。実際、空の文字列の最初と最後の文字を取得しようとすると、例外が発生します。