2017-10-10 5 views
0

私は次のコードを持っています。それは関数のとおりです:あなたはメソッドを呼び出し、それに数値を与えます。それはあなたがそれを与えた数のすべての順列を印刷します。変更を返す変数(Java)

は、例えば:

順列(3)

それが印刷されます:あなたのようなメソッドが呼ぶ

123、132、213、231、312、 321,

ここにコードは

01です
public static void main(String[] args) { 
    permutations(3); 
} 

public static void permutations(int n) { 
    boolean used[] = new boolean[n]; //all set to false by default 
    int perm[] = new int[n]; 
    permutations2(used, 0, perm); 
} 

private static void permutations2(boolean used[], int index, int perm[]) { 
    if (index == used.length) { 
     for (int i = 0; i < perm.length; i++) { 
      System.out.print(perm[i] + ""); 
     } 
     System.out.print(", "); 
     return; 
    } 

    for (int i = 0; i < used.length; i++) { 
     if (!used[i]) { 
      used[i] = true; 
      perm[index] = i + 1; 
      permutations2(used, index + 1, perm); 
      used[i] = false; 
     } 
    } 

} 

私の質問は返信になります。変数 'index'は何らかの理由で戻り値が呼び出されたときに変更されます。誰も私になぜこれが起こるか説明することができますか?コードは正常に動作します。

申し訳ありません。

+1

これは再帰的なアルゴリズムなので、 'index'の新しい値が引数としてスタックにプッシュされますが、呼び出し元の値は変わりません。ヒント:IDEで、再帰呼び出しが行われる前にブレークポイントを設定し、関数がどのように深くなってから復帰しているかを確認します。 –

+1

変更されません。それが何であるかを正確に指定することができれば、それを説明することができます。同じ関数を複数回呼び出してスタックし、それぞれに変数のコピーを取得していることに注意してください。 – chrylis

+0

'index'の値は変更されず、新しい値を割り当てない限り変更されません! – BaSsGaz

答えて

0

permutations2は再帰関数である、とあなたは再帰的なベースケースに達したとき、すなわちインデックス== used.length、リターンが呼び出され、コードは1つの再帰呼び出しを移行するインデックス+ 1

に再帰的にそれを呼び出しますインデックスが1つ小さいときに戻る。