家有可爱多呢 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 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值