2017-03-29 14 views
0

私はいくつかの数字の間のすべての切り替えの可能性を計算する再帰的な方法を使用しなければならない学校のためのプロジェクトがあります。 I.E:[1,2] => 1,2および2,1。int []のArrayListの再帰的メソッド

私はこの方法を使用しましたが、コンソール上でソリューションを印刷するだけで正しく動作しているように見えましたが、ArrayListのタブをストックしたいときは(後で使用する必要があります)同じ順序を追加してください。私の例では、1,2と2,1の代わりに1,2と1,2を追加していました。

はここに私のコードは次のとおり

public static void permute(int start, int[] input, ArrayList <int[]> al) { 
    //This method is recursive, it will open multiple instances of the input tab by calling itself and modify them, then stock tab in ArrayList when the operations are done for this tab. 
    //ArrayList must be empty. 

    //Printing tab if iterations for that specific tab are done 
    if (start == input.length) { 
     al.add(input); 
     //////////////////////////////// 
     // For printing tabs in console. 
     // for(int x: input){ 
     // System.out.print(x); 
     // } 
     // System.out.println(""); 
     //////////////////////////////// 
    //End the specific tab loop when it's printed 

    return; 
    } 
    for (int i = start; i < input.length; i++) { 
     // Changing numbers 
     int temp = input[i]; 
     input[i] = input[start]; 
     input[start] = temp; 

     ////////////////////////////////////////////////// 
     // Tests to see algorithm steps 
     // 
     // System.out.print("temp : " + temp + " ... "); 
     // System.out.print("i : "+i + " ... "); 
     // System.out.print("start : " + start); 
     // System.out.println(""); 
     // System.out.print("---"); 
     // for(int x: input){ 
     // System.out.print(x); 
     // } 
     // System.out.println(""); 
     ////////////////////////////////////////////////// 

     //Changing numbers 
     permute(start + 1, input, al); 

     // Changing numbers 
     int temp2 = input[i]; 
     input[i] = input[start]; 
     input[start] = temp2; 

} 

}

Iスタート= 0を使用して、入力= {1,2,3}とArrayListの方法が開始される前に空です。

お手数ですが、ありがとうございます!

答えて

1

問題は、配列への参照をArrayListに追加して、アルゴリズムの変更を続けているということです。

最後に、同じ配列のperm(N)コピーがあります。

あなたがしなければならないのは、このように、ArrayListのに配列のディープコピーを追加することです。そして、その結果のArrayListをします印刷

al.add(Arrays.copyOf(input, input.length)); 

代わりの

al.add(input); 

次の出力を生成します。

[1, 2, 3] 
[1, 3, 2] 
[2, 1, 3] 
[2, 3, 1] 
[3, 2, 1] 
[3, 1, 2] 
+0

ありがとうございました! 私のラインとディープコピーの違いをあなたに聞かせてもらえますか?私は、入力参照でディープコピーをいつ使うべきですか? –

+0

オブジェクトへの現在の参照のコピーだけではなく、オブジェクトの実際の新しいコピーを取得したい場合はいつでもディープコピーを使用したいと思うでしょう。後者の場合、基礎となるオブジェクトを参照することで他のコードを修正することはできません。これがなぜ必要なのかを理解するために、 "参照または値によるJavaのパスですか?" – Edd