2012-05-03 53 views
0

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

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 
+0

嗯,这是如果不知道'List'包含什么数据就很难追踪。 – Lion

+0

你的'System.out.println(...)'语句在哪里?那些你可以用来帮助调试你的问题? –

+0

可能的(简单)清单将是 {[3.0,6.0,9.0, [3.0,7.5], [4.5,7.5], [4.5,9.0]} 我有System.out中的我最终,我认为我会从我之前发布的代码中拿走他们的代码,因为它会让事情变得混乱。如有必要,我可以发布。 – Aaron

回答

0

此代码是乞求运行到一个计算器。阅读逻辑:

可以说面板是空的....

  1. 呼叫buildPanel
  2. 设置duplicateFoundfalse
  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); 
    }