0

スタックできるシーケンス (ArrayList) の組み合わせの数を計算しようとしていますが、各行には、指定された「HEIGHT」まで、隣接する行に含まれる要素を含めることはできません。リストのリスト「rowCombos」(グローバル)があります。これは、各行にある可能性のある要素のすべての可能な組み合わせです。私のコードは、上記の制約に従って、「rowCombos」を循環して、前の行の上に配置できる行コンボを確認する必要があります。「パネル」が 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
4

1 に答える 1

0

このコードは、スタック オーバーフローに陥りそうです。ロジックを読む:

パネルが空だとしましょう....

  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);
    }
    
于 2012-05-03T00:29:19.823 に答える