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

时间:2014-02-04 15:47:58

标签: 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。我不清楚堆栈帧本身的开销。

感谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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