简体   繁体   English

递归函数上的StackOverflow

[英]StackOverflow on Recursive Function

I have the following function which is supposed to yield all coordinates in a cartesian plane I can reach from an origin in n steps: 我有以下功能,该功能应该产生我可以在n步中从原点到达的笛卡尔平面中的所有坐标:

The origin is 'location' and the number of steps is 'strength' which is an int 1-10. 原点是“位置”,步数是“强度”,它是整数1-10。 However, I keep getting a stackoverflow error. 但是,我不断收到stackoverflow错误。 Every time I call it I then call clear on the ArrayList positions. 每次调用它时,我都会在ArrayList位置上调用clear。 Thoughts? 有什么想法吗?

Updated code: 更新的代码:

// Returns all positions reachable in 'strength' steps
    public ArrayList<Int2D> findEscapeSpace(Int2D location, Field f) {
        // Are we still within the given radius?
        if((Math.abs(location.getX() - this.location.getX()) + Math.abs(location.getY() - this.location.getY())) < strength) {
            System.out.println("Starting on " + location);
            // If this position is not contained already, and if it doesn't contain a wall
            if(!positions.contains(location) && f.wallField.getObjectsAtLocation(location) == null) {
                positions.add(location);
                System.out.println("added " + location);
            }

            // Getting neighboring positions
            ArrayList<Int2D> neigh = findNeighPos(location, f);

            for(Int2D pos : neigh) {
                System.out.println("looking into " + pos + " at depth " + (Math.abs(location.getX() - this.location.getX()) + Math.abs(location.getY() - this.location.getY())) + " and strength " + strength);

                if(!positions.contains(pos))
                    findEscapeSpace(pos, f);

            }

        }
        System.out.println(positions.size());
        return positions;

    }

Old code 旧代码

public ArrayList<Int2D> positions = new ArrayList<Int2D>();

    // Returns all positions reachable in 'strength' steps
    public ArrayList<Int2D> findEscapeSpace(Int2D location, Field f) {

        // Are we still within the given radius?
        if((Math.abs(location.getX() - this.location.getX()) + Math.abs(location.getY() - this.location.getY())) < strength) {
            // If this position is not contained already, and if it doesn't contain a wall
            if(!positions.contains(location) && f.wallField.getObjectsAtLocation(location) == null)
                positions.add(location);

            // Getting neighboring positions
            ArrayList<Int2D> neigh = findNeighPos(location, f);

            for(Int2D pos : neigh) {

                findEscapeSpace(pos, f);

            }

        }

        return positions;

    }

public ArrayList<Int2D> findNeighPos(Int2D currentP, Field f) {

        ArrayList neighPositions = new ArrayList<Int2D>();

        int cx = currentP.getX();
        int cy = currentP.getY();

        int maxY = f.HEIGHT-1;
        int maxX = f.WIDTH-1;

        // A few checks to make sure we're not going off tack (literally)

        if(cx > 0 && cy < maxY)
            neighPositions.add(new Int2D(cx-1, cy+1));

        if(cy < maxY)
            neighPositions.add(new Int2D(cx, cy+1));

        if(cx < maxX && cy < maxY)
            neighPositions.add(new Int2D(cx+1, cy+1));

        if(cx > 0)
            neighPositions.add(new Int2D(cx-1, cy));

        if(cx < maxX)
            neighPositions.add(new Int2D(cx+1, cy));

        if(cx > 0 && cy > 0)
            neighPositions.add(new Int2D(cx-1, cy-1));

        if(cy > 0)
            neighPositions.add(new Int2D(cx, cy-1));

        if(cx < maxX && cy > 0)
            neighPositions.add(new Int2D(cx+1, cy-1));

        return neighPositions;

    }

Your recursion does not appear to have a termination condition. 您的递归似乎没有终止条件。 It looks like you may want to pass strength as an argument to findEscapeSpace() , and when that method recurses for it to pass a value one less than the one passed to it. 看起来您可能想要将strength作为参数传递给findEscapeSpace() ,并且当该方法递归使它传递的值比传递给它的值小一个时。

Other than that, your algorithm looks fairly inefficient, as it is likely to generate and test many of the reachable cells many times each, and, moreover, it will be comparatively expensive to check whether each one has already been found. 除此之外,您的算法看起来效率很低,因为它可能会多次生成并测试许多可到达的单元,此外,检查每个单元是否已被发现的成本也相对较高。 But that's the next problem to overcome. 但这是下一个要克服的问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM