Java中递归和循环的优劣

简介: Java中递归和循环的优劣 介绍: 你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归。

Java中递归和循环的优劣

介绍:
你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归。
但是如果你打开一扇门后,同样发现前方也有一扇门,紧接着你又打开下一扇门.....但是却一直没有碰到尽头--这就是循环。
简单来说:循环是有去无回,而递归是有去有回(因为存在终止条件)。
循环:当满足某一条件时反复执行某一操作(循环体)。
递归:在一个方法内部对自身进行调用的方法。
递归结构包括两个部分:
1、递归头:即什么时候不调用自身方法,也就是递归的结束条件。如果没有递归头,程序将陷入死循环。
2、递归体:即什么时候需要调用自身方法。
好了,废话不多说,直接来撸代码(计算阶乘的方法)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package  com.bjwyj.method;
/**
  * 递归和循环的比较
  * @author 吴永吉
  *
  */
public  class  TestRecursion {
     public  static  void  main(String[] args) {
         //以下调用System下的currentTimeMillis()方法只是为了说明递归调用比循环调用更耗时
         long  l1 = System.currentTimeMillis();  
         System.out.println(factorial( 5 ));
         long  l2 = System.currentTimeMillis();
         System.out.println( "递归计算阶乘耗时:" +(l2-l1));
         
         System.out.println( "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" );
         long  time1 = System.currentTimeMillis();
         System.out.println(factorialLoop( 5 ));
         long  time2 = System.currentTimeMillis();
         System.out.println( "循环计算阶乘耗时:" +(time2-time1));
     }
     
     //使用递归定义计算阶乘的方法
     public  static  long  factorial( int  num) {
         if (num== 1 ) {     //递归头
             return  1 ;
         } else  {
             return  num*factorial(num- 1 );     //递归体
         }
     }
     
     //使用循环定义计算阶乘的方法
     public  static  long  factorialLoop( int  n) {
         int  result =  1 //接收计算结果
         while (n> 1 ) {
             result *= n*(n- 1 );   //实现计算结果的累乘操作
             n -=  2 //每次减去2,实现数字的迭代操作
         }
         return  result;
     }
}

  执行结果:

1
2
3
4
5
120
递归计算阶乘耗时: 1
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
120
循环计算阶乘耗时: 0

  

  由结果可以看出,使用递归算法比使用循环算法更耗时。
为了更好地比较递归算法的优劣,上述采用while循环与递归算法进行对比。
先来分析上述递归方法的执行过程,如下图:

  循环方法的执行过程,如下图:

  这里为了看起来清晰,只是简单地画出了栈内存中的执行过程(这样画更便于理解)。

总结:
栈,主要是用来存放栈帧的,每执行一个方法就会出现压栈操作,所以采用递归的时候产生的栈帧比较多,递归就会影响到内存,非常消耗内存。而使用循环就执行了一个方法,压入栈帧一次,只存在一个栈帧,所以比较节省内存。

原文地址https://www.cnblogs.com/wuyongji/p/10503391.html

相关文章
|
2月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中stream API与传统for循环在性能上的对比,通过多个示例分析了不同场景下两者的优劣。作者指出,尽管stream API使代码更简洁,但不当使用会降低可读性和性能,特别是在处理大数据量时。实验结果显示,在多数情况下,普通for循环的性能优于stream API,尤其是在单次操作耗时较短但需多次执行的场景中。文章建议开发者在设计初期就考虑全局流程,避免重复使用stream流,以提升代码质量和性能。
Java循环操作哪个快?
|
2月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
5月前
|
存储 Java
|
3月前
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
78 6
|
4月前
|
Java
java基础(2)循环语句for、while、do...while
本文介绍了Java中的基础循环语句,包括for循环、while循环和do...while循环。文章通过示例代码展示了for循环的基本结构和用法,while循环的先判断后执行逻辑,以及do...while循环的先执行后判断逻辑。这些循环语句在Java编程中非常常用,用于执行重复的任务。
66 4
java基础(2)循环语句for、while、do...while
|
3月前
|
Java 测试技术 数据安全/隐私保护
📖Java零基础-while循环语句的深度解析
【10月更文挑战第6天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
58 1
|
3月前
|
传感器 Java 测试技术
📖Java零基础-do-while循环语句的深入剖析
【10月更文挑战第5天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
47 1
|
4月前
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
36 1
java基础(11)函数重载以及函数递归求和
|
4月前
|
Java
Java循环
Java循环
48 6
|
4月前
|
编译器
Java--for循环语句
Java--for循环语句
下一篇
开通oss服务