Не могу понять, почему рекурсия никогда не разрешается - PullRequest
0 голосов
/ 21 февраля 2012

Мой друг делает клон тральщика, и он попросил меня помочь с той частью, где, когда вы щелкаете по незаполненному / не числовому «пустому» квадрату, он обнаруживает все смежные пробелы. Ниже приведен код, который я написал. Я не могу понять, почему это никогда не разрешается.

Мой базовый случай должен быть, когда циклы for полностью выполняются и оператор if никогда не возвращает true.

Есть ли что-то, чего мне не хватает?

Кстати, в Java. Кроме того, я сказал ему, что метод изменения состояния кнопки должен быть назначен методу: p

public void revealAdjacentNulls(int r, int c)
{
    int ir, ic;

    //literal edge cases :P

    int rmax = (r == 15) ? r : r + 1;
    int cmax = (c == 15) ? c : c + 1;

    //check all spaces around button at r,c

    for(ir = (r==0) ? 0 : r-1; ir <= rmax; ir++){

        for (ic = (c==0) ? 0 : c-1; ic <= cmax; ic++){

            //if any are blank and uncovered, reveal them, then check again around the blanks

            if (buttons[ir][ic].value == 0 && buttons[ir][ic].isCovered == false)
            {
                buttons[ir][ic].setEnabled(false);  //number uncovered
                buttons[ir][ic].setBackground(Color.blue);
                buttons[ir][ic].setText(Character.toString(buttons[ir][ic].value));
                buttons[ir][ic].isCovered = false;
                revealAdjacentNulls(ir, ic);
            }
        }
    }

}

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Давайте рассмотрим случай, когда r==0 и c==0, и давайте предположим, что buttons[0][0].value == 0 и что buttons[0][0].isCovered == false.

Самая первая итерация цикла вызовет саму функцию сте же аргументы 0, 0 и с неизменным состоянием value и isCovered.Это немедленно приведет к бесконечной рекурсии.

PS Ознакомьтесь со статьей Википедии , чтобы узнать о других алгоритмах заливки.

0 голосов
/ 21 февраля 2012

Другой случай: если r == 15, то цикл будет от 14 (r - 1) до 15 (rmax).Если ваше утверждение if верно, то рекурсия будет бесконечной.То же самое относится к c.

0 голосов
/ 21 февраля 2012

Ну, во-первых, он всегда будет повторяться за revealAdjacentNulls(r, c). Ваше условие - isCovered должно быть ложным - но тогда вы также устанавливаете isCovered в ложное. Вы хотели написать:

buttons[ir][ic].isCovered = true;

? Или, возможно, ваш чек должен быть:

if (buttons[ir][ic].value == 0 && buttons[ir][ic].isCovered)

(Это зависит от того, что вы подразумеваете под «покрыто».)

...