所以我试图解决这个问题:
前50个自然数字写在板上。您应用以下操作49次,直到您到达最后一个号码:
从电路板中选择任意两个数字,a和b。
删除这两个数字,并用| a-b |替换它们。
确定电路板上最终剩余电量值的所有可能值的总和。
我写了以下代码:
package brillianorg;
import java.util.ArrayList;
public final class AComplexFunction {
ArrayList<Integer> integerArray;
AComplexFunction()
{
this.integerArray = new ArrayList<>();
for(int i = 1;i<=4;i++)
{
integerArray.add(i);
}
System.out.println(returnPathSum(integerArray));
}
int returnPathSum(ArrayList<Integer> newArray)
{
int pathSum = 0;
System.out.println(newArray);
if(newArray.size() == 1)
{
pathSum+=newArray.get(0);
}
else
{
for(int index1 = 0;index1<newArray.size();index1++)
{
System.out.println("iterating through first loop");
for(int index2 = index1+1;index2<newArray.size();index2++)
{
System.out.println("index 1:"+index1+"index 2:"+index2+"array size:"+newArray.size());
ArrayList<Integer>tempArray = newArray;
int difference = Math.abs(newArray.get(index1)-newArray.get(index2));
tempArray.set(index2, difference);
tempArray.remove(index1);
pathSum+=returnPathSum(tempArray);
}
}
}
return pathSum;
}
}
为什么虽然它确实运行,但是有点困惑,for循环似乎不是迭代的。我有点困惑为什么。
你能告诉我为什么不迭代吗? (请不要为我解决问题,除非修复迭代问题解决了问题)
答案 0 :(得分:1)
您似乎试图使用
制作列表的副本 ArrayList<Integer> tempArray = newArray;
但是这并没有复制列表 - 它只会创建另一个引用。结果,所有递归调用共享(并从中删除项目)一个列表,并且随着列表缩小,循环迭代次数减少。你可能想要
ArrayList<Integer> tempArray = new ArrayList<>(newArray);
代替。