lundi 14 septembre 2020

Recursive Function throws StackOverflowError

can someone tell me why my recursive function gives me a StackOverflowError?

I researched myself and found out, that I may need to add more memory to my Stack, but I need an solution without increasing the memory.

I already tried to change the code to not always creating a new Hashset, but that didn't work either.

public Set<Tile> reachable() {
        Set<Tile> output = new HashSet<>();
        output.add(this);
        for (Direction d : Direction.values()
        ) {
            if (this.oneStep(d) != null) {
                output.addAll(this.neighborTile(d).reachable(d.reverse()));
            }
        }
        return output;
    }

    public Set<Tile> reachable(Direction comesFrom) {
        Set<Tile> output = new HashSet<>();
        output.add(this);
        for (Direction d : Direction.values()
        ) {
            if (this.oneStep(d) != null && d != comesFrom) {
                output.addAll(this.neighborTile(d).reachable(d.reverse()));
            }
        }
        return output;
    }

It is accessed via:

    @Test
    public void testReachable() {
        assertEquals(IntStream.of(0, 1, 2, 3, 4, 7, 9, 10, 11, 14, 16, 17)
                              .mapToObj(tiles::get)
                              .collect(Collectors.toSet()),
                     maze.getTile(0, 0).reachable());

        assertEquals(IntStream.of(26, 27, 33, 34, 41, 47, 48)
                              .mapToObj(tiles::get)
                              .collect(Collectors.toSet()),
                     maze.getTile(6, 6).reachable());
    }

But I am not allowed to change the testing code.

thanks in advance! :)

Error:

java.lang.StackOverflowError
    at java.base/java.util.HashMap.putVal(HashMap.java:652)
    at java.base/java.util.HashMap.put(HashMap.java:607)
    at java.base/java.util.HashSet.add(HashSet.java:220)
    at maze.Tile.reachable(Tile.java:104)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
    at maze.Tile.reachable(Tile.java:108)
...


Process finished with exit code -1

Aucun commentaire:

Enregistrer un commentaire