Искал на вопросе SO, где я предложил заполнение сетки узлов рекурсивны, и я думал, что я должен попробовать код для себя следующее держит переливРекурсивное заполнение перетекает
public class Node {
private Node left;
private Node right;
private Node up;
private Node down;
private int x;
private int y;
public Node(int x, int y) {
this.x = x;
this.y = y;
}
public static void buildGrid(Node node) {
fill(node);
}
private static void fill(Node node) {
fillLeft(node);
fillRight(node);
}
private static void fillRight(Node node) {
if (node.right != null || node.x > 10)
return;
node.right = new Node(node.x + 1, node.y);
fill(node.right);
}
private static void fillLeft(Node node) {
if (node.left != null || node.x <= 0)
return;
node.left = new Node(node.x - 1, node.y);
fill(node.left);
}
public static void main(String[] args) {
Node node = new Node(5, 5);
buildGrid(node);
}
Это так поздно я мог бы пропустил очень очевидное, но почему это переполнение? В первый раз fillLeft
возвращается с fill(node.left)
, второй звонок fillLeft(node.left)
должен немедленно возвращаться с node.left.right != null
. То же самое для fillRight
, не может понять, что здесь не так.
StackTrace
Exception in thread "main" java.lang.StackOverflowError
at Node.<init>(Node.java:16)
at Node.fillLeft(Node.java:42)
at Node.fill(Node.java:26)
at Node.fillRight(Node.java:35)
at Node.fill(Node.java:27)
at Node.fillLeft(Node.java:43)
at Node.fill(Node.java:26)
at Node.fillRight(Node.java:35)
at Node.fill(Node.java:27)
at Node.fillLeft(Node.java:43)
at Node.fill(Node.java:26)
at Node.fillRight(Node.java:35)
at Node.fill(Node.java:27)
at Node.fillLeft(Node.java:43)
at Node.fill(Node.java:26)
at Node.fillRight(Node.java:35)
at Node.fill(Node.java:27)
at Node.fillLeft(Node.java:43)
at Node.fill(Node.java:26)
at Node.fillRight(Node.java:35)
at Node.fill(Node.java:27)
at Node.fillLeft(Node.java:43)
at Node.fill(Node.java:26)
at Node.fillRight(Node.java:35)
at Node.fill(Node.java:27)
at Node.fillLeft(Node.java:43)
Какой именно след отслеживания вы получаете? Может быть, неявный стек java - это тот, который переполняется из-за всей рекурсии. – skytreader
Просьба показать конструктор 'Node'. –