递归绘制圆圈

时间:2014-02-25 17:25:50

标签: java recursion

我试图画出这个: enter image description here

public void drawCircle(int x, int y, int diameter, int it) {
    int d = diameter / 3;
    if (it == 0) {
        return;
    }
    g.setColor(Color.green);
    g.fillOval(x, y, d, d);
    drawCircle(x, y, d, it--); // centre
    drawCircle(x - d, y, d, it--); // left
    drawCircle(x + d, y, d, it--); // right

}

出于这个问题的目的,忽略我画圈子的实际位置 - 我会稍后改变它,因为它不太正确。但是,我在程序的逻辑中哪里出错了?对我来说,似乎很清楚我称这种方法在每次迭代中绘制三个圆圈。这是我的错误:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at sun.java2d.loops.ProcessPath.ProcessMonotonicCubic(Unknown Source)
at sun.java2d.loops.ProcessPath.ProcessCubic(Unknown Source)
at sun.java2d.loops.ProcessPath.doProcessPath(Unknown Source)
at sun.java2d.loops.ProcessPath.fillPath(Unknown Source)
at sun.java2d.pipe.BufferedRenderPipe.fillPath(Unknown Source)
at sun.java2d.pipe.BufferedRenderPipe.fill(Unknown Source)
at sun.java2d.pipe.BufferedRenderPipe.fillOval(Unknown Source)
at sun.java2d.SunGraphics2D.fillOval(Unknown Source)
at Draw.drawCircle(Draw.java:40)
at Draw.drawCircle(Draw.java:41)

以下是第40和41行:

g.fillOval(x, y, d, d);
drawCircle(x, y, d, it--); // centre

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您的递归调用在每次递归调用期间都会收到it的相同值,因为it--会在递减之前返回it的值。

假设您希望在一次迭代中保持it的值不变,只需将it - 1传递给递归调用,例如

drawCircle(x, y, d, it - 1); // centre