家有可爱多呢 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日

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)