家有可爱多呢 2022-04-16 22:55 采纳率: 100%
浏览 57
已结题

java递归耗时居然比循环的短,这是为什么呢?

问题遇到的现象和发生背景

我今天练习了下递归,也写出了用循环来实现的代码,结果我用时间一比较,递归耗时居然比循环的短,这是为什么啊?

问题相关代码,请勿粘贴截图
public static void main(String[] args) {
          long t1 = System.nanoTime();
          System.out.println("循环算法求20阶乘结果:"+nonRecusiveFactorial(20));
          long t2 = System.nanoTime();
          System.out.println("循环耗时:"+(t2-t1)+"纳秒");
          System.out.println();
          long t3 = System.nanoTime();
          System.out.println("递归算法求20阶乘结果:"+recusiveFactorial(20));
          long t4 = System.nanoTime();
          System.out.println("递归耗时:"+(t4-t3)+"纳秒");
}

static long nonRecusiveFactorial(int n) {
        long result = 1;
        while (n > 1) {
            result *= n * (n - 1);
            n -= 2;
        }
        return result;
}
static long recusiveFactorial(int n) {
        if(n==0) {
            System.out.println("0的阶乘为1");
            return 0;
        }
        if(n==1) {
            return 1;
        }else {
            return n*recusiveFactorial(n-1);
        }
}

运行结果及报错内容

循环算法求20阶乘结果:2432902008176640000
循环耗时:239760纳秒

递归算法求20阶乘结果:2432902008176640000
递归耗,时:37770纳秒

我的解答思路和尝试过的方法

我以为是long的太大计算结果的丢失,也换过BigDecimal类来计算,结果还是递归的耗时低

我想要达到的结果

搜了很多资料都说递归比循环的效率低,结果我测试出来却是递归的耗时短,我不仅写了这个例子,还写了递归、循环实现十进制转二进制,还写了其他例子,结果都是递归的耗时短。难道是因为效率不一定就是体现在时间上吗?

  • 写回答

1条回答 默认 最新

  • JonathanYTR 2022-04-17 05:03
    关注
    
    public static void main(String[] args) {
            long t1 = System.nanoTime();
            long result = nonRecusiveFactorial(20);
            long t2 = System.nanoTime();
            System.out.println("循环算法求20阶乘结果:" + result);
            System.out.println("循环耗时:" + (t2 - t1) + "纳秒");
            System.out.println();
            long t3 = System.nanoTime();
            result = recusiveFactorial(20);
            long t4 = System.nanoTime();
            System.out.println("递归算法求20阶乘结果:" + result);
            System.out.println("递归耗时:" + (t4 - t3) + "纳秒");
        }
    

    主函数改成这样再测,两个方法都是2000ns左右,sout包含在计时之内会耗时很长估计是jvm字符串拼接和初始化和链接标准输出耗时长。这种问题想看实际耗时关系就要把无关的东西去掉。刷过leetcode基本都知道,提交的时候但凡不小心加了sout都会TLE,就是因为字符串相关的操作很耗时。同理按原来的写法先打印递归再打印循环就变成递归超级慢了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月25日
  • 已采纳回答 4月17日
  • 创建了问题 4月16日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效