天天看点

浅谈循环与递归的优劣 DK

<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;
   }
           

  一句话,变量是好,亲们请合理使用!(此博客纯属个人理解,求打脸!!!)

继续阅读