递归Stackoverflow错误

时间:2011-11-11 06:08:00

标签: recursion stack-overflow

好吧,所以我正在尝试制作一个Java程序来解决picross板,但我不断收到Stackoverflow错误。我现在只是在教自己一点Java,所以我喜欢使用我所知道的东西,而不是在网上找到解决方案,虽然我的方式显然不那么有效。我能想到解决这个问题的唯一方法就是通过一种蛮力,尽一切可能。问题是,我知道这个功能有效,因为它适用于较小尺寸的电路板,唯一的问题是,对于较大的电路板,我倾向于在功能完成之前出错。

所以char[][] a只是具有所有X和O的游戏板。 int[][] b是一个数组,其中包含为picross板指定的数字,如游戏顶部和左侧的数字。 isDone()只检查主板是否与给定的数字匹配,shift()向下移动一列。我不想粘贴整个程序,所以如果您需要更多信息,请告诉我。谢谢!

我添加了移位代码,因为有人问。 Shift只是将一行中的所有字符向上移动一个单元格。

更新:我在想,也许我的代码并没有在每个组合中转动,因此它会跳过正确的答案。任何人都可以验证这是否真的尝试了所有可能的组合?因为这可以解释为什么我会收到stackoverflow错误。另一方面,在它太多之前可以经历多少次迭代?

public static void shifter(char[][] a, int[][] b, int[] clockwork)
{
    boolean correct = true;

    correct = isDone(a, b);

    if(correct)
        return;

    clockwork[a[0].length - 1]++;

        for(int x = a[0].length - 1; x > 0; x--)
        {
            if(clockwork[x] > a.length)
            {
                shift(a, x - 1);

                clockwork[x - 1]++;
                clockwork[x] = 1;
            }

            correct = isDone(a, b);

            if(correct)
                return;
        }

    shift(a, a[0].length - 1);

    correct = isDone(a, b);

    if(correct)
        return;

    shifter(a, b, clockwork);

    return;
}

public static char[][] shift(char[][] a, int y)
{       
        char temp = a[0][y];

            for(int shifter = 0; shifter < a.length - 1; shifter++)
            {
                a[shifter][y] = a[shifter + 1][y];
            }

        a[a.length - 1][y] = temp;

    return a;
}

1 个答案:

答案 0 :(得分:0)

检查递归调用。并给出终止条件。

if(terminate condition)
{
exit();
}
else
{
call shifter()
}