无法弄清楚为什么递归永远不会解决

时间:2012-02-20 20:43:44

标签: java recursion minesweeper

我的朋友正在制作一个扫雷克隆人,他让我帮忙点击一个非矿井/非数字“空白”方块的部分,它会显示所有相邻的空白。以下是我写的代码。我无法弄清楚为什么它永远无法解决。

我的基本情况应该是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 个答案:

答案 0 :(得分:2)

让我们考虑r==0c==0的情况,让我们假设buttons[0][0].value == 0buttons[0][0].isCovered == false

循环的第一次迭代将导致函数使用相同的参数0, 0调用自身,并且状态为valueisCovered。这将立即导致无限递归。

P.S。查看Wikipedia article了解其他洪水填充算法。

答案 1 :(得分:0)

一方面,它始终会继续revealAdjacentNulls(r, c)的递归。您的条件是isCovered必须为假 - 但您也 isCovered设置为false。你的意思是写:

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

?或者你的支票可能是:

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

(这取决于你所说的“覆盖”。)

答案 2 :(得分:0)

另一种情况:如果r == 15,则循环将从14(r-1)到15(rmax)。如果你的if语句为true,那么将会有无限递归。这同样适用于c。