1

私は以下のこのコードをステップ実行していましたが、理解できない部分は、n 値が 2、5、および 10 になる方法を理解していません。 else 部分に (0%2) を出力します。その後、プログラムを停止するべきではありませんか?

void fun2(int n){
    System.out.println("Entering"+n);
    if(n==0)
        return;
   else{
        fun2(n/2);
        System.out.print("Leaving"+n+"---->");       
        System.out.println(n%2);
    }
}

出力:

      Entering5
      Entering2
      Entering1
      Entering0
      Leaving1---->1
      Leaving2---->0
      Leaving5---->1
      Leaving10---->0
4

1 に答える 1

1

まず、出力にエラーがあると思います。fun2()上記のコードを 5 の値で呼び出して実行すると、行を除いて、Leaving10---->0指定したすべての出力が得られます。これが関数の出力にあるfun2()か、または呼び出したコードの場所からのアーティファクトであると確信していますfun2()か? おそらくfun2()、値 10 で関数を呼び出していて、出力の最初の最初の行を省略していEntering10ませんか?

この関数は、各 2 進数の値を計算することによって機能します。これは、else ブロックの最終行でモジュロ演算子 (剰余演算子とも呼ばれます) として知られる % 演算子を使用して行われます。System.out.println(n%2);

101 = (1*2^2) + (0*2^1) + (1*2^0) = 4 + 0 + 1 = 5

で呼び出されるため、各反復では次に低い 2 の累乗が計算されn/2ます。ここでは整数除算を扱っているため、剰余がないことに注意してください。1/2 = 0 です。0.5 ではありません。ただし、整数モジュラス関数は正常に機能するため、1%2 = 1 (1 を 2 で割る = 0 で余りが 1) となります。

メソッドの各再帰レベルの詳細を次に示します。

  1. n = 5、n/2 = 2、fun2(2)、n%2 = 1
  2. n = 2、n/2 = 1、fun2(1)、n%2 = 0
  3. n = 1、n/2 = 0、fun2(0)、n%2 = 1
  4. n = 0、メソッドが返す

個々のコンソール出力をまとめると、5 のバイナリである 101 が得られます。

パラメータ値 10 で呼び出しfun2()た場合、出力は次のようになります1010

1010 = (1*2^3) + (0*2^2) + (1*2^1) + (0*2^0) = 8 + 0 + 2 + 0 = 10
于 2013-07-08T02:04:12.840 に答える