如何避免递归函数的 StackOverflowError

2022-09-03 05:21:54

我正在编写一个函数,它将调用自身大约5000次。当然,我得到一个.有没有办法以相当简单的方式重写这段代码?StackOverflowError

void checkBlocks(Block b, int amm) {

    //Stuff that might issue a return call

    Block blockDown = (Block) b.getRelative(BlockFace.DOWN);
    if (condition) 
        checkBlocks(blockDown, amm);


    Block blockUp = (Block) b.getRelative(BlockFace.UP);
    if (condition) 
        checkBlocks(blockUp, amm);

    //Same code 4 more times for each side

}

顺便说一句,我们可以调用函数的深度的限制是什么?


答案 1

使用对象的显式堆栈和循环,而不是调用堆栈和递归:

void checkBlocks(Block b, int amm) {
  Stack<Block> blocks = new Stack<Block>();
  blocks.push(b);
  while (!blocks.isEmpty()) {
    b = blocks.pop();
    Block blockDown = (Block) b.getRelative(BlockFace.DOWN);
    if (condition)
      blocks.push(block);
    Block blockUp = (Block) b.getRelative(BlockFace.UP);
    if (condition) 
      blocks.push(block);
  }
}

答案 2

Java 中的默认堆栈大小为 512kb。如果超过该程序将终止抛出StackOverflowException

您可以通过传递 JVM 参数来增加堆栈大小:-Xss1024k

现在堆栈大小为 1024kb。您可以根据您的环境提供更高的价值

我不认为我们可以以编程方式改变这一点。


推荐