2015-11-29 92 views
0

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

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

该代码基本上试图找出类似字母的最大连接区域(上,下,左,右)。所以这就是为什么我有一个最大和最小变量。 –

+0

并将温度变量更改为tempCount –

回答

2

问题是这样的:假设我们有一个维数为2x1的简单数组,值为[“5”,“5”]。 建议我们正在寻找“5”。那么它将打到前五名。从那里将检查所有的邻居。因此,它将在第二个五年后再次搜索所有邻居。所以它会打到前五,从那里它会再次搜索所有邻居。因此,它将在第二个五年后再次搜索所有邻居。所以它会打到前五,从那里它会再次搜索所有邻居。因此,它将在第二个五年后再次搜索所有邻居。所以它会打到前五,从那里它会再次搜索所有邻居。

...你的模式^^

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每次开始新的搜索。

+1

Thanx调用它“良好解释”;-) – JayC667