2016-06-27 14 views
-1

次のコードについては混乱します。変数 "temp"に代入される値がどこから来るのかわかりません。何とか、魔法のように、2と4の値が割り当てられます。Java再帰 - これらの値はどこから来ますか?

power()メソッドが実行され、y> 0の場合、メソッド内で発生するのはpower()メソッドが自分自身を呼び出すことだけで、2またはaの値を返すことはできませんその方法からの4。

私は、コードが正しいこと、そしてこれが再帰呼び出しであることを理解していますが、特に、power()メソッド内のどのコード行が、 temp変数に追加します。ここで

public static void main(String[] args) 
{ 
    int x = 2; 
    int y = 3;  
    System.out.println("Value returned is: " + power(x,y)); 
} 
public static int power (int x, int y) 
{ 
    if (y <= 0) 
    { 
     return 1; 
    } 
    else 
    { 
     int temp = power(x, y - 1);         
     System.out.println("Value of temp before is: " + temp); 
     System.out.println("Value of x is: " + x); 
     System.out.println("value of z before is: " + z);    
     z = x* temp;   
     System.out.println("value of z after is: " + z); 
     System.out.println("Value of temp after is: " + temp); 
     System.out.println("***********************************************"); 
     return z; 
    } 
} 

結果、次のとおりです。

Value of temp before is: 1   <==This is assigned 1 by return 1; 
Value of x is: 2 
value of z before is: 0 
value of z after is: 2 
Value of temp after is: 1 
********************************** 
Value of temp before is: 2   <==This is assigned by return z returning to power() method call 
Value of x is: 2 
value of z before is: 2 
value of z after is: 4 
Value of temp after is: 2 
********************************** 
Value of temp before is: 4   <==This is assigned by return z returning to power() method call 
Value of x is: 2 
value of z before is: 4 
value of z after is: 8 
Value of temp after is: 4 
********************************** 
Value returned is: 8 
+0

前提条件に応じて2つの 'return'文のうちの1つ。 – Compass

+0

1、2、および4を返す "return z"コードですか? –

+1

'return z'は' 2'と '4'を返し、' return 1'は '1'を返します。デバッガでコードをステップ実行し、 'power(...) 'と渡されたパラメータの値の呼び出しを追跡します。 –

答えて

3
  1. power()を引数として2と3と呼ばれています。
  2. 同じことが再び、起こりますが、引数として2と1
  3. でようやく、power()の最後のインスタンスが2で呼び出された引数
  4. として2でpower()の新しいインスタンスを呼び出し、2 int temp = power(x, y - 1);このラインと0を引数として返します
  5. 初めての場合、if (y <= 0)の条件が真であるため、power()呼び出しのこのインスタンスはreturn 1;というステートメントを実行します。
  6. power()の前のインスタンスは、その結果(1)をとり、z = x* temp;を実行して2の値を返します。その値を返します。
  7. power()の次のインスタンスは、xを乗じ、同じこと(2)となって4
  8. 再帰呼び出しの全てを待機した呼ばれたpower()(最初のものの最終的なインスタンスを、それ)は最終的に再帰呼び出しから4の値を返し、x(2)で乗算し、最終的な答えとして8を得ます。

再帰に関する一般的な情報についてはウィキペディアを参照して、どのように動作します:https://en.wikipedia.org/wiki/Recursion

呼び出しの一つが「ベースに到達するまでの主なアイデアは、この方法は、問題を単純化し、再び自分自身を呼び出すことです場合'。ベースケースは次のとおりです。

if (y <= 0) 
{ 
    return 1; 
} 

ベースケースを解くと、ベースケースの結果に基づいて他のケースを解くことができます。

+0

詳細な説明をありがとうございます。これは非常に役に立ちました。 –

+0

インスタンスの代わりにpower()の_activations_について説明することで、この回答を改善することができます。 "Instance"はメソッドのコピーが複数存在するように聞こえますが、これは真ではなく、noobはそれを_class_のインスタンスと混同する可能性があります。 –

1

powerの呼び出しのたびに、引数の現在の値がメソッドスタックにプッシュされます(データ構造の参照で「スタック」を参照)。あなたは、ペンとペーパー( "ペンテスト")を実行したり、別の呼び出しごとに新しい値を使って実行をトレースしなければなりません。このように:

x=2 y=3 temp = power(2, 2) 
     x=2 y=2 temp = power(2, 1) 
       x=2 y=1 temp = power(2, 0) 
        x=2 y=0 return 1 
       temp = 1 
       z = 2 * temp = 2 * 1 = 2 
       return 2 
     temp = 2 
     z = 2 * 2 = 4 
     return 4 
temp = 4 
z = 2 * temp = 2 * 4 = 8 
return 8 
+0

サマリーがよりよく言えるかもしれませんが、この回答が提供するビジュアルが好きです。 – nhouser9

+0

データサンプルをありがとうございました。これは多くの助けになります! –

関連する問題