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