所以我有一个globar数组和一个递归函数。例如,递归函数自己执行16次,而bestOrder=array2D
行只应达到两次。程序实际上只到达它两次,但是每次在此行中更改array2D(array2D[position] = i;
)时,bestOrder会更改其值。 BestOrder应包含2 0 3 1个订单,但在函数的末尾它包含3 2 1 0(array2D的最后一个值)。我该如何解决这个问题?
private static int[] bestOrder;
private static void Permutate(int[] array2D, int position, Point[] checkpoints)
{
if (position == array2D.Length)
{
if (GetPathLen(checkpoints, array2D) < min)
{
min = GetPathLen(checkpoints, array2D);
bestOrder= array2D;
}
return;
}
for (int i = 0; i < array2D.Length; i++)
{
bool found = false;
for (int j = 0; j < position; j++)
if (array2D[j] == i)
{
found = true;
break;
}
if (found) continue;
array2D[position] = i;
Permutate(array2D, position + 1, checkpoints);
}
}
答案 0 :(得分:1)
数组是引用类型意味着它们在分配给变量或传递给方法时实际上不会被复制。而是传递它们的引用(指向内存中相同位置的指针)。一种方法是Clone
并转换为实际复制数组。
bestOrder = (int[])array2D.Clone();
另一种方法是创建空数组。并用另一个数组的元素填充它。
bestOrder = new int[array2D.Length];
for(int i = 0; i < bestOrder.Length; i++)
{
bestOrder[i] = array2D[i];
}