家有可爱多呢 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 做一个web书店,带答辩
  • ¥15 #求带 python,使用pycharm爬取智联招聘数据资源并保存为Excel文件,同时以图表形式呈现
  • ¥15 学校优化算法怎么样,国内用的多吗?
  • ¥15 微信购物商城购物车的所有功能以及购物车,和首页的搜索功能
  • ¥40 servlet的web程序部署出错
  • ¥50 activiti 新建流程系列问题
  • ¥50 为什么我版本升级之后运行速度变慢5倍??
  • ¥15 如何在gazebo中加载机械臂和机械手
  • ¥15 纯运放实现隔离采样方案设计
  • ¥20 easyconnect无法连接后缀带.com的网站,一直显示找不到服务器ip地址,但是带有数字的网站又是可以连接上的,如何解决