再帰について最も重要なことは、何も特別でないことです。です。それは次のステートメントを実行する前に、ステートメントを完了する必要があります方法ですべてのものと同じように:
私の例を見てみると
public void someMethod() {
someOtherMethod();
someLastMethod();
}
それはsomeOtherMethod
が終了した後someLastMethod
が呼び出されることは明らかです。 someOtherMethod
を何か再帰的なものに置き換えても、実際には関係ありません。 someLastMethod
を呼び出す前に完了する必要があります。もう一度、あなたの再帰的方法を見てみると:各呼び出しn >= 0
に対して
public void recMethod(String str, int n) {
if(n >= 0) {
recMethod(str, n – 1);
System.out.print(str.charAt(n));
recMethod(str, n – 1);
} else { // base case added for clarity
return;
}
}
、System.out.print
方法はrecMethod
への呼び出しを呼び出される前に呼び出す必要があります。 recMethodを呼び出すたびに、n
とstr
というコードがあるので、コードが「非常によく似ている」以外はまったく異なるメソッドと見なすことができます。
すべての呼び出しは、ベースのケースと一致するか、またはnをデクリメントして同じメソッドの結果を必要とするため、ベースケースから開始し、nが-1
のときに後方に動作します。 recMethod("ABCD",-1)
に何が起こるかを想像してみてください。まあ、何も印刷しません。
次に、recMethod("ABCD",0)
を参照し、それが何もしないことを知っているベースケースを呼び出し、「A」を印刷して、再び何もしない最初のステートメントと同じものを呼び出します。それで「A」を印刷します
recMethod("ABCD",1)
を見ると、 recMethod("ABCD",0)
が "A"を印刷した後、 "B"を印刷し、 "A"を印刷するrecMethod("ABCD",0)
を呼び出します。したがって、 "ABA"を印刷します。
recMethod("ABCD",2)
を見ると、 「ABA」を印刷するrecMethod("ABCD",1)
が呼び出された後、「C」が印刷され、「ABA」を印刷するrecMethod("ABCD",1)
が呼び出されます。それで「ABACABA」を印刷します。
recMethod("ABCD",3)
を見ると、 recMethod("ABCD",2)
が「ABACABA」を印刷し、「D」を印刷した後、「ABACABA」を印刷するrecMethod("ABCD",2)
を呼び出します。したがって、 "ABACABADABACABA"を印刷します。
は動作しませんので、意味がありません。おそらく、コードにはこれに関するテストが必要ですか、おそらくプライベートであり、n
がstr
境界を越えないようにするn
のないパブリックなものが必要ですか?
再帰的に動作するメソッドを作成する場合は、同じことを行います。
ベースケースではどうなりますか? (どのように停止する必要がありますか)
メソッドが意図したとおりに動作しているかのように表現された基本ケースでない場合はどうなりますか?ここでのキャッチは、ここで同じメソッドへの各呼び出しが基本的なケースに当たるように再帰がバインドされている少し簡単な問題か、無限再帰を取得する必要があることです。
それはそれです!それが動作します。
質問には再帰はありません。 –
メソッドの名前を変更して、例を明確にしましたが、メソッド内で名前を変更するのを忘れました。 – SirDanceAlot