当前位置: 首页 > 知识库问答 >
问题:

如何增加堆栈大小以允许更多递归?

宋鸿德
2023-03-14

我在处理中运行递归方法,但当作业太大时,它会给我以下错误:

由于等待数据包139时超时,事件线程崩溃。

但当递归很小时,它可以工作。有没有办法增加堆栈以解决更大的递归问题?

这是我的代码,用于在屏幕上绘制人物。它适用于较小的数字,但不适用于较大的数字。

boolean pit;
int xc;
int yc;
color negro;
color rojo;
color c;
long tiempoI;
long tiempoF;
long espera;
void setup(){
  size(500,500);
  negro=color(0,0,0);
  negro=color(0,0,0);
  rojo=#FF0000;
  pit=false;
  tiempoI=millis();
  tiempoF=millis();
  espera=5;
}
void draw(){
  background(240);
  noSmooth();
  //dibujarRectangulo(0,0,300,300);
  rect(0,0,100,100);
  if(pit){
    pintar(xc,yc);
  }
}
void mousePressed() {
  xc=mouseX;
  yc=mouseY;
  pit=true;
  loadPixels();
  c=pixels[xc+(width*yc)];
  println(red(c)+" "+green(c)+" "+blue(c));


}
public void pintar(int x,int y){
  if(x<width&&x>0&&y<height&&y>0){
    stroke(rojo);
    c=get(x,y);
    if(c!=rojo&&c!=negro){
      point(x,y);
    }
    c=get(x+1,y);
    if(c!=rojo&&c!=negro){
      pintar(x+1,y);
    }

    c=get(x-1,y);
    if(c!=rojo&&c!=negro){
      pintar(x-1,y);
    }

    c=get(x,y+1);
    if(c!=rojo&&c!=negro){
      pintar(x,y+1);
    }

    c=get(x,y-1);
    if(c!=rojo&&c!=negro  ){
      pintar(x,y-1);
    }

  }
}

回溯

共有3个答案

寿高阳
2023-03-14

递归时可能会超过堆栈。你的树不应该太深。请参阅此处的一些注意事项。

但是,基于您的stacktrac和您提供的代码,问题不在代码的这一部分。基于stacktrac,您似乎递归调用了一些GUI方法或鼠标事件处理方法,而不是方法pintar()。

方苗宣
2023-03-14

它可能只是很慢。从100 x 100图像到500 x 500图像将像素数从10000增加到250000。这是一个很大的飞跃。递归方法最终会在每个像素上调用多个调用。这可能会让事情陷入困境。

如果是这样的话,试着逐渐增加图像大小,并计时随着图像大小的增加,程序需要多长时间。您可以预计500x500版本的时间是100x100版本的25倍。这对你来说是合理的执行时间吗?

如果是这样的性能问题,看看您是否可以将其切换到迭代实现,也许可以将行程()调用提升到循环之外。

还要注意,除非您使用noLoop()和redraw()进行控制,否则在循环内调用draw()。你可能想在这里做。在较大的图像上,您的draw()可能速度太慢,无法在分配的时间间隔内运行,并且正在备份调用和事件处理。

楚宇
2023-03-14

您的错误确实是由过多的递归引起的StackOverflow,但Process用您看到的奇怪错误掩盖了这一点。有关该错误的文档在这里。

您可以增加Java堆栈大小以增加递归调用的限制。信息可以在这里找到,但要点是您必须在运行时将-Xss设置传递给Java。

但是,该设置要求您将草图作为Java应用程序运行。这是可能的,但需要将草图导出为jar,然后通过命令提示符运行jar,或者切换到eclipse。这比简单地在处理过程中点击run按钮要做的工作多得多,任何发送jar的用户都必须这样做。

相反,您可能应该重构算法以消除过度递归。

 类似资料:
  • 问题内容: 我问了这个问题,以了解如何增加JVM中的运行时调用堆栈大小。我有一个答案,而且我还有很多有用的答案和注释,这些注释和注释与Java如何处理需要大型运行时堆栈的情况有关。我在回答摘要中扩展了我的问题。 最初,我想增加JVM堆栈的大小,以便程序运行时无需安装。 相应的配置设置是具有足够大值的命令行标志。对于TT上面的程序,它可以与OpenJDK的JVM一起工作: 答案之一也指出这些-X…标

  • 这与其他关于Node中错误消息的问题不同,错误消息中写着RangeError:超出最大调用堆栈大小,因为我确切地知道为什么会收到这条错误消息。它的发生是因为我在递归,事实上递归了很多次。 谢谢。

  • 问题内容: 我正在运行一个用Java在Eclipse中编写的程序。对于很大的输入,该程序具有很深的递归级别。对于较小的输入,程序运行正常,但是在给出较大的输入时,出现以下错误: 可以通过增加Java堆栈大小来解决此问题,如果可以,那么如何在Eclipse中做到这一点? 更新: @乔恩·斯基特 该代码递归地遍历解析树以建立数据结构。因此,例如,代码将使用解析树中的一个节点来做一些工作,并在该节点的两

  • 问题内容: 这与有关Node中读取 RangeError 的错误消息的其他问题不同 :超出最大调用堆栈大小的 原因是我确切知道为什么收到此错误消息。之所以会这样,是因为我要递归,实际上递归很多。 谢谢。 问题答案: 来自: 更新:如注释所示,即使帮助文本仍列出了该选项,您也需要在节点v0.10.x中使用它。

  • 我遇到了MySQL的问题。我收到错误。关于StackOverflow,他们说MySQL配置中的很可能太低。 我尝试在中更改它,但该文件是不可编辑的。不能在PA上使用。 我正在使用Sqlalchemy处理与MySQL服务器的交互。 我能做什么?

  • 问题内容: 我收到以下错误: 问题答案: 以下是一些可用来更改堆大小的选项。