Рекурсивная ошибка переполнения стека - PullRequest
1 голос
/ 11 ноября 2011

Хорошо, поэтому я пытаюсь создать Java-программу для решения платы Picross, но получаю сообщение об ошибке Stackoverflow. В настоящее время я просто учу себя немного Java, и поэтому мне нравится использовать вещи, которые я знаю, вместо того, чтобы найти решение онлайн, хотя мой путь, очевидно, не такой эффективный. Единственный способ, которым я мог придумать, чтобы решить это, был через грубую силу, пробуя любую возможность. Дело в том, что я знаю, что эта функция работает, потому что она работает для плат меньшего размера, единственная проблема заключается в том, что на более крупных платах я склонен получать ошибки до завершения функции.

так что char[][] a - это просто игровое поле со всеми X и O. int[][] b - это массив с номерами, назначенными для игровой доски, например, числа сверху и слева от игры. 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 голосов
/ 11 ноября 2011

Проверьте рекурсивный вызов. И укажите условие завершения.

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