<p>在任何程序语言中,几乎都能看到循环,而递归则用的比较少,我是从C开始接触递归的.例如 求M的阶乘,那么什么是递归呢,简单来说,递归就是循环,举个例子</p><div><pre name="code" class="html">
</pre><pre name="code" class="java"> public int digui(int a){
if(a>1){
return a*digui(a-1);
}else{
return a;
}
}
那么,递归就是程序自己调用自己,上面是阶乘的事例.递归一般用于生成树等方面,循环就不举例了.想上述是比较简单的递归,举个复杂点的例子
</pre><pre name="code" class="html"> <pre name="code" class="html"> public Map<string,object> tree(Map<string,object> map){
Map<string,object> tree = new HashMap<string,object>();
tree = (Map<string,object>) map.get("tree");
if(tree!=null){
tree(tree);
}
}
这是稍微复杂点的递归,可以看到,每一次调用函数,就会创建一个新的Map(当然,上述程序中也不是必须创建的,只是用来书名问题),假设一下,这个递归会调用自身10W次,那么,内存中会存在10W个map,
这时候有人会想到GC,
好的,java中的确有GC回收机制,那么GC回收机制是怎么回收的呢?
java在jvm启动时,会自动分配一个线程,此线程是系统自动创建,用户可以用System.gc();调用,但是我没看见哪个智障写过这样的代码.敢写的不是智障就是大咖
gc是怎么调用的呢?定时,你没看错,就是定时,意思是,当变量在作用域外之后,java程序无法使用该变量之后,但是如果你记录了该变量在内存的地址,你可以尝试用指针调用下(求大咖尝试).
悲催的是,你在递归时,十万个MAP并不会被立即回收,还在内存中,那,就是垃圾!!!!!!!!!!
因此,递归要合理的调用,因为有些业务用递归的确更方便.
联想到循环,也尽量被在循环中定义变量可以这样玩
int a =0;
for(xx;xx;xx){
a = xx;
}
一句话,变量是好,亲们请合理使用!(此博客纯属个人理解,求打脸!!!)