在递归调用期间发现StackOverflowError以在2D数组中查找最接近的空索引

时间:2015-04-01 02:00:15

标签: java

如果输入索引已经有一个元素,我试图使用递归方法找出我的2D数组中最近的空元素。例如,我调用我的方法tryPlant(int X, int Y)在我的2D(32x32)数组中放置一个符号:

  1. ecoArray [X] [Y] =="。" (空)然后用"〜"
  2. 填写
  3. 如果除了"。"之外还有一个元素,则先递归找到同一行中的下一个空白点,然后是列。
  4. 该方法的代码是:

    public void tryPlant(int X, int Y){
        if (this.ecoArray[X][Y] == ".") {
            this.ecoArray[X][Y] = "~";
        }else{
            if((Y - 1) >= 0) {
                tryPlant(X, Y - 1);
            }
            else if((Y + 1) <= 32){
                tryPlant(X, Y + 1);
            }else if((X - 1) >= 0 ) {
                tryPlant(X - 1, Y);
            }else if((X + 1) <= 32){
                tryPlant(X + 1, Y);
            }
        }
    }
    

    我在另一个类中调用该方法:

    Plant p1;
    
    private void initPlants(){
            int size = p1.initPop;
            for (int i = 0; i < size; i++) {
                int randX = randGen();
                int randY = randGen();
                Plant plant = new Plant(randX, randY, this.ecoArray);
            }
        }
    

    randGen()方法返回0-31之间的随机整数。

    有时,随机生成器为我提供索引,使它们不会与其他对象发生碰撞。一个例子(|是障碍物):

    Planting trees

    我想知道为什么会出现stackoverflow错误以及我可以做些什么来修复它。如果您需要我的代码的任何其他部分,请询问。我对Java很新。

    修改

    public static int left = 0;
    public static int right = 0;
    
       public void tryPlant(int X, int Y){
            if (this.ecoArray[X][Y] == ".") {
                this.ecoArray[X][Y] = "~";
            }else{
    
                if((Y - 1) >= 0) {
                    this.left++;
                    tryPlant(X, Y - 1);
                }
                else if((Y + this.left + 1) <= 32){
                    tryPlant(X, Y + this.left + 1);
                    this.left = 0;
                }else if((X - 1) >= 0 ) {
                    this.right++;
                    tryPlant(X - 1, Y);
                }else if((X + this.right + 1) <= 32){
                    tryPlant(X + + this.right + 1, Y);
                    this.right = 0;
                }
            }
        }
    

1 个答案:

答案 0 :(得分:-2)

大致发生的事情是:每次调用函数时,它都存储在内存堆栈中。当函数返回时,清除的内容被清除。但是,如果调用太多函数,则会满足内存并发送堆栈溢出错误。

你得到一个stackoverflow错误,因为你的算法中有一个循环。这导致对tryPlant()的过多调用。

  • 首先,当您找到已经通过的方式时,请返回。 (char == '~'
  • 第二,有障碍的地方,返回。 (char == '|'
  • 第三,你没有尝试所有方向:

        if ((Y - 1) >= 0) {
            this.left++;
            tryPlant(X, Y - 1);
        } else if ((Y + this.left + 1) <= 32){
            tryPlant(X, Y + this.left + 1);
            this.left = 0;
        } else if ((X - 1) >= 0 ) {
            this.right++;
            tryPlant(X - 1, Y);
        } else if ((X + this.right + 1) <= 32){
            tryPlant(X + + this.right + 1, Y);
            this.right = 0;
        }
    

我试过这个似乎有效:

public class Test {

    private char[][] ecoArray;

    public Test() {
        String[] stringArray = new String[] {
        "||.|.||..|..||.|.||||||||..||.||",
        "||||....||..|||..||....|.||..|||",
        "||||||...|.|||...||.|..||..||||.",
        "||...||.|.|||.||||.|||||.|...||.",
        "|.|....|.|||||||||..||.|.|.||...",
        "..|||.||||...|..||.||..|..||||.|",
        "..|.||||||..||.||||..|||.|.|...|",
        "|||||.||.|||...||...||..||.|||..",
        "||||.|..||||||..|.|||...||.||.|.",
        "|||.|||||.|||||.||||.|....||||||",
        "||...||||||.|.|||||||||||.|.|.||",
        "|.|.||||||||.||||....|.||||.||||",
        "||..||.||||.|..||.|||..||.|.||||",
        "..||..|..||.|.|||..|||..|||||.|.",
        "||||.|.||.||||.|||||..|||.|.....",
        "..|.|.|||..|||..||.||||.|||.|..|",
        "||||.|..|||||||.|||||.||.|.|....",
        "..|...||...|||||.|...|..|...|||.",
        "..|||||||..||...||||||..|..|||||",
        "||||..||.|.|||||.||||.|||||.||..",
        "|||||.||||.|....||||....||.||...",
        "||..||.|||||.||||||..||..|....||",
        "|.||||.||..|...|.|..|||.|.|||.||",
        "...||||.|..|||.|||..|.||...|.|||",
        ".||||.|..|.|..||..||..||..||||||",
        "|||.|||..|||..||||.||||.|.||.|||",
        "|||||.||...|.|.|.||...|||..|.|||",
        ".||||.|.|.|||...|||.|||.....||||",
        "|||.|||.|.|...||.|....||||.|.|||",
        ".||||||.|||||||...||..|||.||||.|",
        "||||.|||||.|.||.||||..|.|||.||||",
        "|.|.||||....|.||||||||.|||||.|.|"
        };

        this.ecoArray = new char[32][32];
        int index = 0;
        for (String s : stringArray) {
            this.ecoArray[index] = s.toCharArray(); 
            ++index;
        }
    }

    public void tryPlant(int X, int Y){
        if (this.ecoArray[X][Y] == '~' || this.ecoArray[X][Y] == '|') {
            return;
        }
        if (this.ecoArray[X][Y] == '.') {
            this.ecoArray[X][Y] = '~';

            if ((Y - 1) >= 0) {
                tryPlant(X, Y - 1);
            } 
            if((Y + 1) < 32){
                tryPlant(X, Y + 1);
            }
            if((X - 1) >= 0 ) {
                tryPlant(X - 1, Y);
            }
            if((X + 1) < 32){
                tryPlant(X + 1, Y);
            }
        }
    }

    private void displayInConsole() {
        for (char[] cl : this.ecoArray) {
            System.out.println(cl);
        }       
    }

    public static void main(String[] args) {
        for (int x = 0; x < 32; x++) {
            for (int y = 0; y < 32; y++) {
                Test t = new Test();
                t.tryPlant(x, y);
                System.out.println("After tryPlant('" + x + "','" + y + "'): ");
                t.displayInConsole();
            }
        }
    }

}

它正在做你需要的吗?我真的不明白你想要去哪里以及想要停止的地方......

结果太遗憾......