java - 如何导出递归函数支持的最高递归级别的计数?

标签 java recursion callstack

如何导出递归函数将支持的递归级别的计数,而无需实际执行具有不同复杂输入的函数。例如当我执行下面的代码时,当函数抛出堆栈溢出错误时,它会显示递归级别。当我执行该程序时,它显示“递归终止于 8373”。

public class Application {
    public static void main(String[] args) throws Exception {

        RecursiveExperimenter experimenter = new RecursiveExperimenter();
        experimenter.experiment();
    }
}

class RecursiveExperimenter {

    public void experiment() {
        try {
            A();
        } catch (StackOverflowError e) {
            System.out.println("Recursion Terminated at " + counter);
        }

    }

    private void A() {
        counter++;
        int a = 0, b = 0, c = 0, d = 0;
        A();
    }

    private int counter = 0;
}

我如何在不实际执行该函数的情况下通过应用一些数学来导出该数字?对于此问题,假设线程的堆栈大小为 1 MB。我不清楚堆栈帧本身的开销。

谢谢。

最佳答案

答案是这个问题没有具体答案。

不存在“递归函数支持的递归级别数”之类的东西。递归概念中没有任何固有的内容对“支持”的递归级别施加任何限制。

实际上,您可以实现的递归级别取决于可用的总堆栈内存以及每次调用占用的内存量。这又取决于机器的物理内存限制、分配给 JVM 的内存量、JVM 的实现、代码是否已优化,以及可能的其他几个因素。如果每次调用都在堆上分配大对象,则堆内存甚至可能成为限制因素。

换句话说,特定程序可实现的递归级别 100% 取决于代码运行的环境。

关于java - 如何导出递归函数支持的最高递归级别的计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21556949/

相关文章:

java - 当多个线程同时尝试获取信号量许可时设置优先级

java - 仅显示 JTable 中的一列

java - 在 Java 中使用递归的影响

assembly - push 和 pop 在 assembly 中是如何工作的

assembly - 为什么 pop 在汇编中需要一个参数?

java - 为什么Netty需要线程池?

java - 我如何知道文件存在或不存在?

list - Haskell 中的过滤

recursion - CLISP dfs 获取程序堆栈溢出

delphi - 需要一种方法来定期记录调用的每个方法/过程/函数的调用堆栈/堆栈跟踪