好的,所以我正在尝试创建一个递归算法,导致产生一系列圆圈。
目前可以看出我已经创建了 circle 类并尝试使用递归,但是正如您可能知道的那样,我对这一切相当陌生。
现在,在正确的位置绘制了所有椭圆后,我在每个圆中都包含一个 Color 对象。我的目标是使圆圈随着圆圈的产生而变化,每组圆圈都是一定的绿色阴影(如上例所示)。
然而,目前绿色阴影应用于不正确的圆圈。如下所示:
如果有人能够冒险猜测为什么会发生这种情况,我将不胜感激。谢谢。
每次调用createCircles()
都应该在中心画一个大圆圈,并为 3 个小圆圈递归调用自己 3 次。y
坐标始终保持不变,您可以通过添加和减去原始圆的半径来重新计算x
坐标。
public void createCircles(int x, int y, int rad) {
Circle myCircle = new Circle(x, y, rad);
circles.add(myCircle);
createCircles(x - (2*rad), y, rad/3);
createCircles(x, y, rad/3);
createCircles(x + (2*rad), y, rad/3);
}
对于溢出错误,您可以对rad
的大小设置终止条件,例如
if (rad < 5) {
return;
}
你需要一个基本情况。这就像递归的退出方法。在您的情况下,createCircles 方法无限重复,这就是它给出溢出异常的原因。试试这个。
public void createCircles(int x, int y, int rad){
int myX = x/3;
int myRad = rad/3;
if(rad != 0){
Circle myCircle = new Circle(myX, y, myRad);
circles.add(myCircle);
createCircles(myX, y, myRad);
createCircles(myX, y, myRad);
createCircles(myX, y, myRad);
}
}
退出子句:如果圆半径变得太小而不值得绘画。
我很感激目前我收到溢出错误,因为 我没有递归的退出条款。
递归算法确实需要一个终止条件。
在您的情况下,一旦圆足够小,您就不想继续递归。所以基本上你只需将这里的三个递归调用包装起来:
createCircles(myX, y, myRad);
createCircles(myX, y, myRad);
createCircles(myX, y, myRad);
进入这样的东西(未经测试,但它应该让你开始):
if (myRad > 0) {
createCircles(myX, y, myRad);
createCircles(myX, y, myRad);
createCircles(myX, y, myRad);
}
因为继续画半径为零的圆是没有意义的。
以下是关于终止条件的维基百科条目:
http://en.wikipedia.org/wiki/Recursion_termination