无限递归帮助 - Java

时间:2015-11-29 23:03:33

标签: java recursion infinite

好的,我有一个小错误 - 似乎我正在尝试解决我的程序无限递归。所以基本上,你读入一个数组,然后取这些值,随机加载到一个二维数组。我已经完成了程序的所有设置和其他方法,但我的递归方法似乎进入无限递归。我的编译器不会告诉我它有什么问题,除了递归语句中的错误之外我无法看到实际的输出。我之前做过类似的问题,这是第一次发生错误,有人能指出我正确的方向吗?

public class Grid
{
    private String[][] grid;
    private int tempCount = 0;

    public Grid()
    {
        grid = new String[10][10];
    }
    public Grid(int rows, int cols, String[] vals)
    {
        setGrid(rows, cols, vals);
    }
    public void setGrid(int rows, int cols, String[] vals)
    {
        grid = new String[rows][cols];
        for(int r = 0; r < grid.length; r++)
            for(int c = 0; c < grid[r].length; c++)
                grid[r][c] = vals[(int)(Math.random() * vals.length)];
    }
    public int findMax(String val)
    {
        int max = 0;
        for(int r = 0; r < grid.length; r++)
        {
            for(int c = 0; c < grid[r].length; c++)
            {
                if(grid[r][c].equals(val))
                {
                    tempCount = 0;
                    int temp = findMaxHelper(r, c, val);
                    if(max < temp)
                        max = temp;
                }
            }
        }
        return max;
    }
    private int findMaxHelper(int r, int c, String search)
    {
        if(r < grid.length && r >= 0 && c < grid[r].length && c >= 0 && grid[r][c].equals(search))
        {
            tempCount++;
            findMaxHelper(r - 1, c, search);
            findMaxHelper(r + 1, c, search);
            findMaxHelper(r, c - 1, search);
            findMaxHelper(r, c + 1, search);
        }
        return tempCount;
    }
    public String toString()
    {
        String output = "";
        for(int r = 0; r < grid.length; r++)
        {
            for(int c = 0; c < grid[r].length; c++)
                output += grid[r][c] + " ";
            output += "\n";
        }
        return output;
    }
}

2 个答案:

答案 0 :(得分:2)

问题在于:假设我们有一个尺寸为2x1的简单数组,以及值[“5”,“5”]。 建议我们正在寻找“5”。然后它将达到前五个。从那里它将检查所有的邻居。 因此,它将在第二个五年,它将再次搜索所有邻居。 因此,它会在前五个位置上升,从那里再次搜索所有邻居。 因此,它将在第二个五年,它将再次搜索所有邻居。 因此,它会在前五个位置上升,从那里再次搜索所有邻居。 因此,它将在第二个五年,它将再次搜索所有邻居。 所以它将会达到前五个,它将再次搜索所有邻居。

...你得到了模式^^

答案 1 :(得分:1)

您需要在findMaxHelper方法中添加额外参数,以记录您已访问过的位置。其原因在@ JayC667的答案中得到了很好的解释。

private int findMaxHelper(int r, int c, String search, boolean[][] dejaVu)
{
    if(r < grid.length && r >= 0 && c < grid[r].length && c >= 0 && !dejaVu[r][c] && grid[r][c].equals(search)) 
    {
        tempCount++;
        dejaVu[r][c] = true;
        findMaxHelper(r - 1, c, search, dejaVu);
        findMaxHelper(r + 1, c, search, dejaVu);
        findMaxHelper(r, c - 1, search, dejaVu);
        findMaxHelper(r, c + 1, search, dejaVu);
    }
    return tempCount;
}

然后,每次开始新搜索时,您都需要将new boolean[10][10]作为dejaVu传递。