再帰については、話さざるを得ない。
1935 ワード
原文のリンク:http://candy-code.iteye.com/blog/1443427
たまたま再帰的な文章を見て、著者の話は分かりやすく書いてあると思いました。
何も言わずにコードを入れておきます。
たまたま再帰的な文章を見て、著者の話は分かりやすく書いてあると思いました。
何も言わずにコードを入れておきます。
public class TestRecursion{
//
public static void fun(int i){
if(i > 0){
i--;
fun(i);
System.out.print(i);
}
System.out.print(" ok ");
}
public static void main(String args[]){
fun(10);
}
}
このコードは簡単に見えるが、その中の奥秘は必ずしも知っているとは限らない。まず.何が再帰ですか?みんなが知っていると思いますが、方法は直接または間接的に自分を呼び出します。再帰を深く理解するには、スタックの観点から方法間の呼び出しを見なければならない。まず簡単な例を見てみます。 public void a(){}
public void b(){
System.out.println("Hello");
a();
System.out.println("boy");
}
メソッドb()がメソッドa()を呼び出した場合、プログラムは順番に実行されず、ジャンプが発生します。CPUは、まず次のマシン命令のアドレスと関連するパラメータ情報をスタックに押し込んでから、プログラムをa()のメソッドにジャンプします。a()方法が戻ると、CPUはスタック操作を実行し、前回記憶したマシン命令のアドレスとパラメータ情報、すなわちSystem.out.println(boy)を取り出す(もちろん、System.out.println()はマシンコマンドではなく、複数のマシンコマンドに翻訳される)再帰方法も同じです。再帰と循環は似ていますが、また違っています。ループはメソッド間の呼び出し関係がなく、コマンドアドレスのスタック、スタックがなく、コマンドアドレスの変更だけである。TestRecursionウィジェットの出力結果を貼り付けます。ok 0 ok 1 ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok
分析呼び出しプロセス:fun(10)->fun(9)->fun(8)->fun(7)->fun(6)->fun(5)->fun(5)->fun(4)->fun(3)->fun(1)->fun(0)私たちは分析を呼び戻しました。i=0では、最初にfun>の条件を満たしません。i)このときi=0.なぜここi=0なのか分からない友達がいるはずです。下のコードを見てください。 public static void fun(int i){// i==1
if(i > 0){//yes
i--; // i==0
fun(i);// fun(0)
System.out.print(i);//i==?
}
System.out.print(" ok ");
}
分析を続けます。「0」を印刷して、「ok」を印刷して、その後、fun(1)の方法が終わったら、fun(2)に戻り、fun(1)の次の文を呼び出します。System.out.print(i)は、この時i=1、順次類推します。