Java 欧几里德树对象堆栈溢出错误(即使存在退出条件)

Java 欧几里德树对象堆栈溢出错误(即使存在退出条件),java,recursion,processing,Java,Recursion,Processing,我试图在Processing/Java中编写一个名为Branch的类。我通过全局变量给了它一个转义条件,但是它创建了太多的递归和堆栈溢出。我很难理解为什么 int maxIterations = 10; int iterations = 0; class Branch { //props float angle, scale, drawingScale; PVector origin, destination; //konstrukt Branch (float _x, f

我试图在Processing/Java中编写一个名为Branch的类。我通过全局变量给了它一个转义条件,但是它创建了太多的递归和堆栈溢出。我很难理解为什么

 int maxIterations = 10;
 int iterations = 0;

class Branch 
{
  //props
  float angle, scale, drawingScale;
 PVector origin, destination;
 //konstrukt
 Branch (float _x, float _y, float _angle, float _scale) {
    origin = new PVector(_x,_y);
    angle = _angle;
    scale = _scale;
    calculateDestination();
    drawMyself();
    rebirth();
  }

  void rebirth() {
    if(iterations < maxIterations) {
      Branch bLeft = new Branch(destination.x,destination.y,angle-50,100);
      Branch bRight = new Branch(destination.x,destination.y,angle+50,100);
      iterations++;
    }
  }

  void calculateDestination() {
    //se till att skala alltid går uppåt.
    scale = abs(scale);
    scale = -scale;
    destination = new PVector(origin.x+angle,origin.y+scale);
  }

  void drawMyself() { 
    drawingScale = scale * -1;
    strokeWeight(10);
    beginShape(LINES);
    vertex(origin.x,origin.y);
    vertex(destination.x, destination.y);
    endShape();

    ellipseMode(CENTER);
    fill(255);
    ellipse(origin.x,origin.y,scale/3,scale/3);
    ellipse(destination.x,destination.y,scale/3,scale/3);

  }


}//End Branch;
int-maxIterations=10;
int迭代次数=0;
班支部
{
//道具
浮动角度、刻度、绘图刻度;
PVector起点、终点;
//康斯特鲁克
分支(浮动x、浮动y、浮动角度、浮动刻度){
原点=新的PVector(x,y);
角度=_角度;
标度=_标度;
计算目标();
抽自己();
重生();
}
虚无重生(){
if(迭代次数<最大迭代次数){
分支bLeft=新分支(目的地.x,目的地.y,角度-50100);
分支亮度=新分支(目标.x,目标.y,角度+50100);
迭代++;
}
}
无效计算目标(){
//直到斯卡拉阿尔蒂德河上游。
刻度=绝对值(刻度);
尺度=-尺度;
目的地=新的PVector(原点.x+角度,原点.y+比例);
}
void draw(){
图纸比例=比例*-1;
冲程重量(10);
开始形状(线);
顶点(原点.x,原点.y);
顶点(destination.x,destination.y);
endShape();
ellipseMode(中心);
填充(255);
椭圆(原点.x,原点.y,比例/3,比例/3);
椭圆(destination.x,destination.y,scale/3,scale/3);
}
}//末端分支;

任何有助于理解其溢出原因或如何在对象内有效使用递归的帮助都是非常值得赞赏的

在创建两个新分支后,唯一可以增加迭代次数的地方是
rebirth()
。问题是,这种增量从未达到

你所拥有的是
retbirth()
调用
Branch()
哪个调用
retbirth()
哪个调用
Branch()
等等,
iterations++
永远不会执行


在调用
分支
之前,您可能应该增加
迭代次数
。此外,如果可能的话,将其用作参数而不是全局变量

,最好能获得更多有关错误的信息,例如回溯。谢谢!在创建新分支之前放置迭代可以阻止溢出。我明白了,现在我有另一个问题要解决,我希望创建两个新分支,一个是负角度,另一个是正角度,这会使它们总是一分为二。但这是运行代码的结果:我用以下参数启动程序中的对象:
b1=new Branch(width/2,height,0100)通过将迭代作为分支的参数,我在上面的注释中解决了这个问题。感谢您提供了非常有用的答案:)