:また、あなたはおそらく、LEN(文字列)== 0とlen(STR)== 1に対してチェックしたくなるでしょう。そうしようとすると、間違った方法を考えていると言います。現在のところ、再帰呼び出しは出力を無視しているため、再帰は無意味です。 is_pal(middle(str))
が返すものは、関数の戻り値には何の影響も与えません。
再帰的アルゴリズムは、問題をより小さな問題に分解し、小さな問題を再帰的に取得し、小さなソリューションを使用してより大きな問題を解決することによって、入力問題を解決します。内部コールから「中断」しないで、ソリューションレベルを1つ戻します。あなたは内線通話か最上位通話かを知る必要があることを知らない(または知る必要がある)。どちらの場合でも、あなたの関数は同じことをしなければなりません:引数が回文であればTrueを返し、そうでなければFalseを返します。
あなたが実装しようとしているアルゴリズムは、基本的にはこれです:
- 文字列の長さが1である場合、最初の文字が同じであれば、それは、回文(真を返す)
- そうでないのです最後の文字である場合、中間文字が回文であれば入力は回文文字列である。
だから、これが何を意味するのか、あなたが最初と最後の文字が同じである確立したら、答えはが正確「への答えと同じが途中あるさ「回文は私の入力である」ということですキャラクターはパリンドロームです "。あなたはあなたの契約を履行するためにその答えを返す必要があります。したがって、再帰呼び出しはis_pal(middle(str))
ではなく、return is_pal(middle(str))
にする必要があります。これがトップレベルのコールだった場合、これが答えです。このがのトップレベルのコールでなかった場合、外側の呼び出しは外側の問題(この場合は単純にそれを返すことで)への答えを解決するためにこの答えが必要になります。
Btwでは、アルゴリズムにもいくつかの問題があります。あなたはFalse
を返すことはありませんので、答えはFalse
(このケースでは、あなたが最初と最後の文字が一致しない場合は、誤って関数の最後から落ちることでNone
を返すために起こる、とNone
意志になることはありません
- おそらく
False
のためのスタンドとしてはありますが、それでも実際にはは正しくありません。)です。
- 文字列の長さは、空の文字列が又はに渡される場合等しい最初と最後の文字のすべての対が取り除かれた後も長さのパリンドロームが渡された場合に起こるゼロなく1(ある場合)、正しい答えが返されず、実際には空の文字列の最初と最後の文字を取得しようとすると、例外が発生します。
出典
2012-05-11 02:31:08
Ben
@ li.davidm:あなたはもっと速かった:) – Qlaus