【问题标题】:For loop not iterating in recursive functionFor循环不在递归函数中迭代
【发布时间】:2014-09-13 23:32:22
【问题描述】:

所以我正在尝试解决这个问题:

前 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 循环似乎没有迭代。我有点不明白为什么。

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

【问题讨论】:

  • 我不确定您要完成什么,但在使用 for 循环遍历集合时从集合中删除元素是个坏主意。您可能需要使用迭代器并重试。
  • @AafreenSheikh 相反,如果他在修改列表时使用迭代器,他会得到ConcurrentModificationException

标签: java recursion iteration


【解决方案1】:

您似乎正在尝试使用

制作列表的副本

ArrayList&lt;Integer&gt; tempArray = newArray;

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

ArrayList&lt;Integer&gt; tempArray = new ArrayList&lt;&gt;(newArray);

改为。

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 2010-12-19
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2011-08-18
    • 2015-07-14
    相关资源
    最近更新 更多