2
class RecTest
{
    int values[];

    RecTest(int i)
    {
        values=new int[i];
    }

    void pray(int i)
    {
        if (i==0) return;
        else 
        {       
            System.out.println(+values[i-1]);
            pray(i-1);
        }
    }
}

class aka
{
    public static void main(String h[])
    {
        RecTest ob=new RecTest(10);
        int i;
        for(i=0;i<10;i++)
            ob.values[i]=i;
        ob.pray(10);
    }
}

このプログラムは正常に動作し、降順で 9,8,7,6,5,4,3,2,1,0 を出力します。しかし、System.out.println(+values[i-1]) と Pray(i-1) ステートメントを入れ替えると、0 から 9 が昇順で出力されます。

誰かがなぜそれが起こっているのか説明できますか?

私はそれを理解することができません。Source-Java-2、完全なリファレンス、第 5 版、171 ページ

4

3 に答える 3

7

スタックを下る途中で印刷するのか、上に戻る途中で印刷するのかが変わります。現在の番号を印刷してから深くするか、深くしてから現在の番号を印刷してください。

3 >
    2 >
        1 >
        print 1
    print 2
print 3

また

3
print 3 >
         2
         print 2 >
                  1
                  print 1
于 2012-05-20T04:39:33.883 に答える
2

このセクションを取るとき

System.out.println(+values[i-1]);
pray(i-1);

そしてそれらを切り替えて、コードの進行について考えてください。

実行は祈りにステップインしますが、何かを印刷する前に、再び祈りに送られ(今回はi = 8)、それを印刷する前に、再び祈りに送られます(i = 7)。 。

最後に、この連鎖の奥深くで、祈りはついに終了します。i = 0の場合、祈りが戻り、実行速度の低下の連鎖がほどけ始めます。

チェーンの最下位のプリントが呼び出され(i = 0の場合)、次にその祈りのメソッドが終了し、チェーンの次のプリントが呼び出されます(i = 1)...など...

このような再帰的なコードを視覚化するのは少し難しいですが、メソッドが最初にmainから呼び出されたときの正確な実行フローを想像して、ステップバイステップで実行してください。また、それでも何が起こっているのかがわからない場合は、デバッガーを使用して手順を実行すると役立つ場合があります。

于 2012-05-20T04:41:35.153 に答える
1

このように書くと、コードは「i-1 を出力してから、他のすべてを実行する」ことを示します。したがって、9 を出力してから、他の数字を続けます。このコンテキストでは、「他のすべてを実行する」とは、print 8、7 などを意味します。しかし重要なのは、9 が最初に印刷されることです。

しかし、この 2 行のコードを逆にすると、「他のすべてを実行してから i-1 を出力してください」と表示されます。したがって、他の数字を処理してから 9 を出力します。このコンテキストでは、「処理する」とは print ..., 7, 8 を意味します。しかし、重要なことに、9 は最後に出力されます。

于 2012-05-20T04:52:28.773 に答える