Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何推导递归函数支持的最高递归级别的计数?_Java_Recursion_Callstack - Fatal编程技术网

Java 如何推导递归函数支持的最高递归级别的计数?

Java 如何推导递归函数支持的最高递归级别的计数?,java,recursion,callstack,Java,Recursion,Callstack,如何推导递归函数将支持的递归级别计数,而不实际使用不同的复杂输入执行函数。例如,当我执行下面的代码时,当函数抛出堆栈溢出错误时,它会显示一个递归级别。当我执行程序时,它显示“递归终止于8373” 我怎么可能在没有实际执行函数的情况下,通过应用一些数学推导出这个数呢?对于这个问题,假设线程的堆栈大小为1MB。我不清楚堆栈框架本身的开销 谢谢。答案是这个问题没有具体答案 没有“递归函数将支持的递归级别计数”这样的东西。递归概念中没有任何固有的东西对“支持”的递归级别施加任何限制 实际上,可以实现的递

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

我怎么可能在没有实际执行函数的情况下,通过应用一些数学推导出这个数呢?对于这个问题,假设线程的堆栈大小为1MB。我不清楚堆栈框架本身的开销


谢谢。

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

没有“递归函数将支持的递归级别计数”这样的东西。递归概念中没有任何固有的东西对“支持”的递归级别施加任何限制

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


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

它取决于JVM实现。另外,您如何知道线程的堆栈大小是1MB?这还取决于递归的方法,因为局部变量通常也在堆栈上分配。65536/8373~=125bytes/frame假设每个调用的堆栈帧相同。另外,不要忘记main()还有一个大小不确定的堆栈帧。只是出于好奇,这个数字在不同的运行之间重复一致吗?@MadPhysical:不,输出不一致。它的范围是8365-8380。这对我来说是新的。原因可能是什么?您是否对某处可用的内存量进行了硬编码?看起来您的堆栈大小并非始终“假定1MB”。我认为你的问题的答案是否定的,你不能“从数学上”得出这个数字。
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;
}