Java - 循环的无限递归

时间:2012-05-03 00:16:17

标签: java recursion for-loop infinite-loop

我正在尝试计算可堆叠的序列组合(ArrayList)的数量,但每行不能包含直到指定“HEIGHT”的相邻行中包含的任何元素。我有一个列表列表,“rowCombos”(全局),它们是每行中可能存在的所有元素组合。我的代码应循环通过“rowCombos”,看看哪一行Combo可以放在前一行的顶部,遵循上面提到的限制。一旦“面板”到达HEIGHT输入参数,它应该递增计数器,然后退出递归方法。我遇到的问题是stackOverflow,我运行了调试以查看它挂起的位置。似乎每个线程都通过该方法工作,然后挂断连续的递归调用......你们中的任何人都能发现我的问题所在吗?

public static void
buildPanels(ArrayList<ArrayList<Float>> panel, int HEIGHT)
{
    if (panel.size() == HEIGHT)
    {
        mainCount++;
        return;
    }
    else
    {
        for ( List<Float> row:rowCombos)
        {
            boolean duplicateFound = false;
            if (!panel.isEmpty())
            {
                for (Float element:row)
                {
                    if (panel.get(panel.size() - 1).contains(element))
                    {
                        duplicateFound = true;
                    }
                }
            }
            if (panel.isEmpty() || !(duplicateFound))
            {
                panel.add((ArrayList<Float>) row);
                buildPanels(panel, HEIGHT);
            }
        } // end of for
    } // end of else
} // end of buildPanels

1 个答案:

答案 0 :(得分:0)

这段代码乞求进入stackoverflow。阅读逻辑:

让我们说面板是空的......

  1. 致电buildPanel
  2. duplicateFound设为false
  3. 如果没有!(duplicateFound),请致电buildPanel

    boolean duplicateFound = false;
    if (!panel.isEmpty())
    {
        for (Float element:row)
        {
            if (panel.get(panel.size() - 1).contains(element))
            {
                duplicateFound = true;
            }
        }
    }
    if (panel.isEmpty() || !(duplicateFound))
    {
        panel.add((ArrayList<Float>) row);
        buildPanels(panel, HEIGHT);
    }