再帰については、話さざるを得ない。

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、順次類推します。