我有一个为学校做的项目,我必须使用递归方法来计算某些数字之间的所有切换可能性。 I.E:[1,2] => 1,2和2,1。
所以我使用了这种方法,当我只是在控制台上打印解决方案时,它似乎正常工作,但是当我想在ArrayList中存储选项卡时(我需要稍后使用它)它总会添加相同的订单。在我的例子中,它将增加1,2和1,2而不是1,2和2,1。
这是我的代码:
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;
}
}
我使用start = 0,input = {1,2,3}并且在方法开始之前ArrayList为空。
希望你能帮忙,谢谢!
答案 0 :(得分:1)
问题是您正在向ArrayList中添加对数组的引用,然后引用您在算法中不断更改的引用。
到最后,您将拥有同一阵列的烫发(N)副本。
您所要做的就是将数组的深拷贝添加到ArrayList中,如下所示:
try
{
# enclose the program
}
finally
{
if($null -ne $streamContent)
{
$streamContent.Dispose()
}
if($null -ne $packageFileStream)
{
$packageFileStream.Dispose()
}
}
而不是
al.add(Arrays.copyOf(input, input.length));
打印生成的ArrayList将生成以下输出:
al.add(input);