为了账号安全,请及时绑定邮箱和手机立即绑定

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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;
     
}
}


  执行结果:

?

12345120递归计算阶乘耗时:1$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$120循环计算阶乘耗时:0

  

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

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

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

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

作者:吴永吉

原文出处:https://www.cnblogs.com/wuyongji/p/10503391.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

0 评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消