介绍:
你用你手中的钥匙打开一扇门,结果去发现前方还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门......但是当你开到一扇门时,发现前方是一堵墙无路可走了,你选择原路返回--这就是递归。
但是如果你打开一扇门后,同样发现前方也有一扇门,紧接着你又打开下一扇门.....但是却一直没有碰到尽头--这就是循环。
简单来说:循环是有去无回,而递归是有去有回(因为存在终止条件)。
循环:当满足某一条件时反复执行某一操作(循环体)。
递归:在一个方法内部对自身进行调用的方法。
递归结构包括两个部分:
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; } } |
执行结果:
12345 | 120 递归计算阶乘耗时: 1 $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 120 循环计算阶乘耗时: 0 |
由结果可以看出,使用递归算法比使用循环算法更耗时。
为了更好地比较递归算法的优劣,上述采用while循环与递归算法进行对比。
先来分析上述递归方法的执行过程,如下图:
循环方法的执行过程,如下图:
这里为了看起来清晰,只是简单地画出了栈内存中的执行过程(这样画更便于理解)。
总结:
栈,主要是用来存放栈帧的,每执行一个方法就会出现压栈操作,所以采用递归的时候产生的栈帧比较多,递归就会影响到内存,非常消耗内存。而使用循环就执行了一个方法,压入栈帧一次,只存在一个栈帧,所以比较节省内存。
作者:吴永吉
点击查看更多内容
为 TA 点赞
0 评论
共同学习,写下你的评论
暂无评论
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦