0

再帰がどのように機能するかを理解しようとしています。再帰呼び出しの配置により、出力が異なる 2 つのコードがあります。異なる出力を持つことが想定されていることは理解していますが、出力が何であるかはわかりません。

コード 1 (印刷後に配置された再帰呼び出し):

public class Test {
    public static void main(String[] args) {
        xMethod(5);
    }

    public static void xMethod(int n) {
        if (n > 0) {
            System.out.print(n + " ");
            xMethod(n - 1);
        }
    }
}

上記の出力は 5 4 3 2 1 です。この出力が得られる理由がわかりました。これは、最初に 5 が印刷され、次に 5 が 1 で差し引かれ、4 が印刷されるなどの理由によるものです。

私が理解していないのは、印刷の前に再帰呼び出しが行われた場合の次のコードの出力です。

コード 2 (印刷の前に配置された再帰呼び出し):

public class Test {
    public static void main(String[] args) {
        xMethod(5);
    }

    public static void xMethod(int n) {
        if (n > 0) {
            xMethod(n - 1);
            System.out.print(n + " ");
        }
    }
}

上記の出力は 1 2 3 4 5 です。この出力が得られる理由がわかりません。出力は 4 3 2 1 であると想像できます。5 が差し引かれ、4 として出力されるなどです。しかし、これは明らかにそうではありません。

誰かが再帰プロセスで何が起こっているのかを理解するのを手伝ってくれますか?

4

4 に答える 4

5

最初のケースでは、印刷が完了してから呼び出しが発生します。

2 番目のケースでは、呼び出しは次のように行われます。

x(5) -> x(4) -> x(3) -> x(2) -> x(1) -> print(1) ->print(2) ->print(3) ->print(4) -> print(5)

終了コールから印刷が開始されます。

x(5)
  |
  x(4)                            print(5)
    |                             | 
    x(3)                    print(4)
      |                     |
      x(2)            print(3)
        |             |
        x(1)    print(2)
          |     | 
          print(1)  

初めての場合

  print(5)
  x(5)
  |
  print(4)
  x(4)                            
    |
    print(3)                             
    x(3)                    
      |
      print(2)                     
      x(2)            
        | 
        print(1)  
        x(1)    
于 2013-09-07T06:59:31.623 に答える