【问题标题】:Java - infinite recursive for loopJava - 无限递归 for 循环
【发布时间】:2012-05-03 00:16:17
【问题描述】:

我正在尝试计算可以堆叠的序列组合 (ArrayList) 的数量,但每行不能包含相邻行中包含的任何元素,直到指定的“高度”。我有一个列表列表,“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

【问题讨论】:

  • 嗯,如果不知道List 包含哪些数据,就很难追踪。
  • 您的System.out.println(...) 声明在哪里?可以用来帮助调试问题的那些?
  • 一个可能的(简单)列表是 {[3.0, 6.0, 9.0], [3.0, 7.5], [4.5, 7.5], [4.5, 9.0]} 我打开了 system.out最后,我想我会把它们从我上面发布的代码中删除,因为它只会把事情弄得一团糟。如有必要,我可以发布。

标签: java recursion for-loop infinite-loop


【解决方案1】:

此代码正在乞求运行到堆栈溢出中。阅读逻辑:

假设面板是空的......

  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);
    }
    

【讨论】:

    猜你喜欢
    • 2020-01-31
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多