为什么我仍然使用尾递归Fibonacci算法烧掉堆栈?

Mas*_*ike 2 java stack-overflow tail-recursion memoization dynamic-programming

堆栈在n = 1000之前溢出.是因为对long []参数的引用,JVM感觉需要保持每个堆栈帧(疯狂猜测),还是我做错了什么?

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        fibonacciMemoized(1000);
        long end = System.currentTimeMillis();
        System.out.println("\nTotal run time: " + (end-start));
    }

    public static void fibonacciMemoized(int n) {
        long[] fibMemos = new long[n+1];
        for (int i = 0;  i < fibMemos.length; i++) {
            fibMemos[i] = Long.MAX_VALUE;
        }
        long fibResult = fib(n, 1, 0, fibMemos);
        System.out.println(fibResult);
    }

    public static long fib(int n, long fibAcc, long fibPrev, long[] fibMemos) {
        if (fibMemos[n] != Long.MAX_VALUE){
            return fibMemos[n];
        } else if (n == 0) {
            return fibPrev;
        } else if (n == 1){
            return fibAcc;
        } else {
            long result = fib(n-1, fibAcc+fibPrev, fibAcc, fibMemos);
            fibMemos[n] = result;
            return result;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Rya*_*art 5

我想这不仅仅是评论的答案:

为什么我仍然使用尾递归Fibonacci算法烧掉堆栈?

因为Java不支持尾部调用消除.

  • @ThomasMcLeod - 就像说汇编语言支持函数式编程.这不是人们通常所说的"支持". (2认同)