私はそれを視覚化することでJavaの再帰を理解しようとしています。私はユーチューブ上のいくつかのチュートリアルを行っていると、そのうちの一つ再帰を視覚化する方法
public class TestRecursion {
public static void main(String []args) {
new TestRecursion().reduceByOne(10);
}
public void reduceByOne(int n) {
System.out.println("Before "+n);
if(n >= 0) {
reduceByOne(n-1);
System.out.println("Inside "+n);
}
System.out.println("After "+n);
}
}
から、私はこれまで理解しているところでは、以下の例を使用して、reduceByOneへのすべての呼び出しは()実行スタックに置かれることになります。だから、最初のメイン
のようなものは、()スタックになります。 reduceByOne(10)を呼び出すので、このメソッドはスタックに到達し、次にreduceByOne(9)を呼び出してスタックにプッシュします。 reduceByOne(-1)がスタックにプッシュされた後、実行するメソッドがなくなり、reduceByOne(-1)がポップされて実行されます。
メソッドがポップされると何が起こるのか理解できません。 reduceByOne(2)がスタックからポップされます。私が実行されますコードは、この
public void reduceByOne(2) {
System.out.println("Before "+2);
if(2 >= 0) {
reduceByOne(2-1);
System.out.println("Inside "+2);
}
System.out.println("After "+2);
}
が、これはスタックに再びreduceByOne(2-1)を入れないだろうようになり、信じますか?それともスキップされますか?もしそうなら、ランタイムは何が実行されるのか、メソッドがポップされたら何をスキップするのかをどのように知っていますか?
あまりにも複雑すぎるかもしれません。しかし、私は再帰の明確な理解を得ることができないので、どんな助けも高く評価されます。
* *「私はトラブルの方法がポップされると何が起こるかを理解したのですか?」 - それは、それが呼び出された時点で、以前の方法に戻りますので、ライン 'のSystem.out.printlnを実行します( "Inside" + n); ' - メソッドを呼び出すのではなく、呼び出されたところに戻ります。 – MadProgrammer
ここで理解できるのは、関数呼び出しをスタックに入れる点です。コール全体がスタックに置かれていないと、実行が開始されます。プログラムは、関数が自分自身を呼び出すまで実行され、その後、その呼び出しはスタックに置かれます。したがって、関数が実行されると(スタックの先頭にポップされたもの)、前の項目は、中断した時点から実行を完了します。 –
再帰的メソッドを理解する最善の方法は、小さな問題の解決法(再帰呼び出しによって解決されている)を既に知っていれば、より大きな問題を解決する方法としてそれを表示することです。行方不明の唯一の事は、基本的な場合です(些細な問題を解決する)。 – Henry