3

再帰呼び出しの後、System.out.println(res) がまだ実行されているのはなぜですか? System.out.println(res); には決して到達しないと思いました。

public class recursion
{
    public static void main(String[] args)
    {
        recursion p = new recursion();
        p.perms(4, "");
    }

    public void perms(int remaining, String res)
    {
        if (remaining > 0) {
           perms(remaining - 1, res + "1");
            System.out.println(res);
        }
    }
}
4

5 に答える 5

8

ステップを考える

call perms(4,"");                   //1 st rec
        perms(3,"1");               //2 nd rec
           perms(2,"11");           //3 rd rec
              perms(1,"111');       //4 th rec

もしそうなら、remaining = 0それは行かないので、今逆の順序を考えてください

           go back to 4th rec and print 111
        go back to 3rd rec and print 11
      go back to 2nd rec and pring 1
    go back to 1st rec and print (blank space)
于 2013-05-31T08:38:04.660 に答える
3

最後の再帰の終わりに実行されない場合、以前のすべての再帰がその行を実行するためです。再帰は、他のメソッド呼び出しと同じです。つまり、終了して別のことを行いますが、終了したら、その時点でこのメソッドを続行します (つまり、次の行)。

于 2013-05-31T08:35:44.020 に答える
2

3 回実行されます。4 回目の呼び出しの後、スタックがポップアップし、呼び出しに戻ってくるためです。

perms(remaining - 1, res + "1");

その後、System.out.println(res)実行されます

最初の呼び出しでは実行されます

CALLING ->  perms(4-1,""+"1") -> check if(3>0) ->perms(3-1,"1"+"1")-> check if(2>0) ->perms(2-1,"11"+"1") ->check if(1>0)->perms(1-1,"111"+"1")->check if(0>0)false              
STACK index ->     0                                      1                                   2                                     3               pop the stack

stack の最初の pop の後、値はに戻ります

->の出力 perms(1 - 1, res + "11"+"1");

実行されます-> System.out.println(res);

インデックス0になるまで同じことが起こります

于 2013-05-31T08:36:43.513 に答える