for循环不在递归函数中迭代

时间:2014-09-13 23:32:23

标签: java recursion iteration

所以我试图解决这个问题:

前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循环似乎不是迭代的。我有点困惑为什么。

你能告诉我为什么不迭代吗? (请不要为我解决问题,除非修复迭代问题解决了问题)

1 个答案:

答案 0 :(得分:1)

您似乎试图使用

制作列表的副本

ArrayList<Integer> tempArray = newArray;

但是这并没有复制列表 - 它只会创建另一个引用。结果,所有递归调用共享(并从中删除项目)一个列表,并且随着列表缩小,循环迭代次数减少。你可能想要

ArrayList<Integer> tempArray = new ArrayList<>(newArray);

代替。