美文网首页
JVM究竟有没有对尾递归进行优化

JVM究竟有没有对尾递归进行优化

作者: 墙角儿的花 | 来源:发表于2019-05-28 22:02 被阅读0次

JVM究竟有没有对尾递归进行优化?

看了好几篇博文,说没有,便在JDK8下做了个测试。

package fibonicc;

public class Test {
    //1 1 2 3 5 8
    private static int fibonicc(int n) {
        if(n<=1) {
            return 1;
        }
        return fibonicc(n-1)+fibonicc(n-2);
    }
    
    //n递减 代表一直运算到n=1为止
    private static int fibonicc2(int n,int last,int total) {
        if(n==1) {
            return total;
        }
        return fibonicc2(n-1,total,last+total);
    }
    //尾递归 还是没有 循环快
    private static int fibonicc3(int n) {
        if(n<=1) {
            return 1;
        }
        int last = 1;
        int current = 1;
        int i=2;
        int tmp = current;
        while(i++<=n) {
            tmp = current;
            current = last+current;
            last = tmp;
        }
        return current;
    }
    
    private static int fibonicc4(int n,int last,int total) {
        if(n==1) {
            return total;
        }
        int result = fibonicc4(n-1,total,last+total);
        return result;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
//      System.out.println(fibonicc(50));
        long start = (System.nanoTime());
        System.out.println(fibonicc2(5000,1,1));
        System.out.println(System.nanoTime()-start);
        start = (System.nanoTime());
        System.out.println(fibonicc3(5000));
        System.out.println(System.nanoTime()-start);
        start = (System.nanoTime());
        System.out.println(fibonicc4(5000,1,1));
        System.out.println(System.nanoTime()-start);
    }

}

fibonicc是普通递归,很慢。

fibonicc2是尾递归实现,fibonicc2(5000,1,1)耗时1092785纳秒,比普通递归快。

fibonicc3是循环实现,fibonicc3(5000)耗时419347纳秒,比尾递归快。

fibonicc4是同fobonicc2的时间复杂度一致的非尾调,耗时1132819,看来和尾递归耗时差不多。

相关文章

  • JVM究竟有没有对尾递归进行优化

    JVM究竟有没有对尾递归进行优化? 看了好几篇博文,说没有,便在JDK8下做了个测试。 fibonicc是普通递归...

  • 什么是尾调用?什么是尾递归?尾调用的优化?尾递归优化?

    尾调用优化 尾递归(尾调用优化)

  • python3 尾递归优化装饰器

    python3中没有进行尾递归优化,但是我们可以实现通过一个装饰器实现尾递归优化。 网上常见的尾递归装饰器是基于P...

  • Kotlin语言(九):特性

    1、尾递归优化 尾递归:函数在调用自己之后没有再执行其他任何操作就是尾递归 尾递归优化的原理就是将递归转换成迭代,...

  • 第2模块第1章2829递归的作用尾递归优化

    尾递归优化 def cal(n): print(n) return cal(n+1) cal(1) 尾递归优化并不...

  • 尾递归优化

    “尾递归优化”的含义是:如果递归函数属于尾递归,那么运行时会优化其调用过程。优化主要针对调用栈,将多层调用,转化为...

  • 9. 递归函数

    使用递归函数需要注意防止栈溢出解决递归调用栈溢出的方法是通过尾递归优化遗憾的是,大多数编程语言没有针对尾递归做优化...

  • 递归优化-尾递归

    一、定义 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。 二、利弊 递归函数...

  • 递归优化-尾递归

    尾递归能否起到优化作用跟编译器有关系,并不是用了尾递归就一定能起到优化作用。 定义:函数里的最后一个动作是返回一个...

  • 递归调用优化

    尾递归优化 函数调用自身,称为递归。如果尾调用自身,就称为尾递归。 递归非常耗费内存,因为需要同时保存成千上百个调...

网友评论

      本文标题:JVM究竟有没有对尾递归进行优化

      本文链接:https://www.haomeiwen.com/subject/bbajtctx.html