• 3.30Java递归结构


    3.30Java递归结构

    递归的基本思想就是"自己调自己"

    过程:

    • 开始打开了一个a

    • 没关闭再继续在内层打开一个a

    • 直到占满了资源就会抛出异常

    • 再b中调用a也是如此,反复横跳直接抛出异常

    递归的要求:
    • 定义递归头:递归的结束条件。如果没有递归头则会陷入死循环---为了使循环结束

    • 递归体:什么时候需要调用自身的方法

    实例:

    /**
    * 测试递归算法(阶乘题目)
    * @author Lucifer
    */
    public class TestRecursion {
       public static void main(String arguments[]){
           long d1 = System.currentTimeMillis(); //显示当前时刻/毫秒数,1970年1月1日零点零分零毫秒开始计算
           System.out.printf("%d阶层的结果为:%s%n",10,factorial(10)); //Java中有占位符的表示方法 %d表示数字,%s表示方法里面的数字,%n表示换行符
           long d2 = System.currentTimeMillis();
           System.out.printf("递归耗时:%s%n",d2 - d1); //耗时时间
      }

       /**
        * 求阶乘的方法
        */
       static long factorial(int n){
           if (n == 1){ //递归头
               return 1;
          }else {
               return n * factorial(n - 1); //n != n * (n-1)
          }
      }
    }

    递归的缺陷:

    • 递归调用会占用大量的系统堆栈,内层耗用多,再递归调用层次多时速度要比循环慢的多

    递归的优点:

    • 简单

    注意:

    任何能用递归解决的问题也能使用迭代(循环)解决。当递归方法可以更加自然地反映问题,并且易于理解和调试、不强调效率问题时,可以采用递归。

    实例:

    /**
    * 递归算法:10的阶乘
    */
    /**
    * 测试递归算法(阶乘题目)
    * @author Lucifer
    */
    public class TestRecursion {
       public static void main(String arguments[]){
           long d1 = System.currentTimeMillis(); //显示当前时刻/毫秒数,1970年1月1日零点零分零毫秒开始计算
           System.out.printf("%d阶层的结果为:%s%n",10,factorial(10)); //Java中有占位符的表示方法 %d表示数字,%s表示方法里面的数字,%n表示换行符
           long d2 = System.currentTimeMillis();
           System.out.printf("递归耗时:%s%n",d2 - d1); //耗时时间
      }

       /**
        * 求阶乘的方法
        */
       static long factorial(int n){
           if (n == 1){ //递归头
               return 1;
          }else {
               return n * factorial(n - 1); //n != n * (n-1)
          }
      }
    }

    实例2:

    /**
    * 循环算法:10的阶乘
    */
    /**
    * 测试递归算法
    * @author Lucifer
    */
    public class TestRecursionNo2 {
       public static void main(String[] args){
           long d3 = System.currentTimeMillis();
           int a = 10;
           int result = 1;
           while(a > 1){
               result *= a * (a - 1);
               a -= 2;
          }
           long d4 = System.currentTimeMillis();
           System.out.println(result);
           System.out.printf("普通循环耗时:%s%n",d4 - d3);
      }
    }

    一般的需求使用循环来写

    递归示意图:

     

    It's a lonely road!!!
  • 相关阅读:
    Android Preference 实现长按监听 longclickable
    表达式求值
    二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
    poj 1806
    树的公共祖先问题LCA
    给定两个长度相同,分别有序的数组A和B,求两个数组中所有数的中位数
    网络爬虫基本原理(转载)
    atoi函数的实现
    一个天平,12个大小,外观相同的球,一个球的重量与其他的不同,称3次找出问题小球
    动态规划求RMQ(区间最值问题Range Minimum/Maximum Query)
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14599938.html
Copyright © 2020-2023  润新知