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

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日

悬赏问题

  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同
  • ¥15 excel 上下按钮 显示行
  • ¥20 云卓h12pro 数传问题
  • ¥20 请问有人知道怎么用工艺库里面的sdb文件通过virtuoso导出来library里面每个cell的symbol吗?
  • ¥20 海思 nnie 编译 报错
  • ¥50 决策面并仿真,要求有仿真结果图
  • ¥15 关于路由器的路由协议配置
  • ¥15 springboot接入微信支付SDK
  • ¥50 大区域的遥感影像匹配 怎么做啊
  • ¥15 求解答:pytorch跑yolov8神经网络受挫