Java 将不断增长的递归转化为迭代?

Java 将不断增长的递归转化为迭代?,java,python,recursion,Java,Python,Recursion,我正在为Minecraft中的一个进程编写一个程序,它应该通过替换你看不见的块来编辑世界并“清理”它 因此,情况是一个立方体块的3D世界。程序需要识别一个空气体,并从每个块向各个方向传播,以查看是否有更多空气接触到它。我用jython编写了一个递归函数,与MCEdit结合使用(jython基本上是java和python之间的桥梁) 问题的根源是每个调用都会创建5个新的调用。 一个示例函数: def checkAir(coordinate): #check if there's air a

我正在为Minecraft中的一个进程编写一个程序,它应该通过替换你看不见的块来编辑世界并“清理”它

因此,情况是一个立方体块的3D世界。程序需要识别一个空气体,并从每个块向各个方向传播,以查看是否有更多空气接触到它。我用jython编写了一个递归函数,与MCEdit结合使用(jython基本上是java和python之间的桥梁)

问题的根源是每个调用都会创建5个新的调用。 一个示例函数:

def checkAir(coordinate):
    #check if there's air and if so, add to a list
    for direction in directions:
        nextCoordinate = direction.increment(coordinate)
        checkAir(nextCoordinate)
在现实中,这个函数要复杂得多。除此之外,在继续之前,它将确保它不会返回到刚得到的坐标,并检查包含空气体坐标的列表,看看它是否已经存在。如果是这样,它将不会进行更多的递归调用

所以问题的根源是一个运行时错误:超过了最大递归深度。又名堆栈溢出


我想知道如何用更迭代的方法编写这个程序,以防止stackoverflow错误。如果你不懂python,我一点也不介意java。我可以自己翻译。提前谢谢你的帮助

您可以使用堆栈等数据结构将递归算法传递到迭代算法:

Stack<Object> stack;
stack.push(first_object);
while( !stack.isEmpty() ) {
   // Do something
   my_object = stack.pop();

  // Push other objects on the stack.

}
Stack;
stack.push(第一个对象);
而(!stack.isEmpty()){
//做点什么
my_object=stack.pop();
//推送堆栈上的其他对象。
}

我不久前写了一个类似的问题。它使用堆栈对象来模拟递归。您可能可以在这里执行类似的操作。我最终使用了一个while循环,该循环在while循环的最后一个过程中记录的位置上进行迭代。可能很相似,但我使用的是集合,而不是堆栈。我不知道这是否更有效!谢谢你的建议。在你的情况下,集合更好,因为你不想重复重复的位置。堆栈更一般,通常是“push”和“pull”的实现。我最终使用了一个python列表,该列表具有与堆栈相同的功能,后来我用一个集合替换了它,因为您所述的原因以及它还有一个pop()方法。谢谢你的帮助!