zoukankan      html  css  js  c++  java
  • 递归

    递归

    • 定义

      在数学于计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含两个意思:递 和 归,这正是递归思想的精华所在。递归就是有去(递去)有回(归来)。
      
    • 递归的分类

      1. 直接递归:称为方法自身调用自己的情况。
      2. 间接递归:归结为方法A调用了方法B,方法B调用方法C,C方法反过来调用了方法A。
    • 递归的三要素

      1. 明确递归的终止条件。
      2. 给出递归终止时处理办法。
      3. 提取重复的逻辑,缩小问题规模。
    • 注意事项

      1. 递归一定要有边界条件(条件限定),保证递归能够停止下来,否则会发生栈内存溢出。
      2. 在递归中虽然有限定条件,但是递归的次数不能太多,否则会发生栈内存溢出现象。
      3. 构造方法禁止递归。
    • 练习

      public class RecursionDemo1 {
          public static void main(String[] args) {
              System.out.println(method(10));
              System.out.println(MaxDivisor(11, 12));
              System.out.println(MinMultiple(11, 12));
              System.out.println(method2(9));//9 *8 *7 *6 *5 *4 *3 *2 *1 = 362880
              File file = new File("E:\尚硅谷Java全套教程\1.尚硅谷全套JAVA教程--基础阶段");
              method3(file);
              searchTxt(file);
          }
          
      //-------------------------------------------------- 
          //文件搜索 遍历所欲的.txt文件
          //1.目录搜索,无法判断有多少级目录,所以使用递归遍历目录
          public static void searchTxt(File dir) {
              File[] files = dir.listFiles();
              for (File f : files) {
                  if (f.isDirectory()) {
                      searchTxt(f);
                  } else {
                      String name = f.getName();
                      //windows文件时忽略大小写的
                      name = name.toLowerCase();//大写转换小写
                      if (name.endsWith(".txt")) {//如果末尾是那就输出
                          System.out.println(f);
                      }
      
                  }
              }
          }
      
      //--------------------------------------------------
          //使用递归打印多级内存目录
          public static void method3(File file) {
              //首先获取到直接子目录和直接子文件
              File[] files = file.listFiles();
              //遍历
              for (File f : files) {
                  //判断如果得到的是一个目录需要再次遍历
                  if (f.isDirectory()) {
                      //表明f是一个目录,则继续遍历这个目录
                      //method3这个方法就是获取所有的文件,
                      //参数传递的刚好就是目录,直接调用就可以了
                      method3(f);
                  } else {
                      //此时f不是一个目录,肯定是一个文件按
                      System.out.println(f);
                  }
      
              }
          }
      //--------------------------------------------------
          //递归求阶乘
          public static int method2(int a) {
              if (a == 1) { //边界条件
                  System.out.print(a + " = ");
                  return 1;
              } else {
                  System.out.print(a + " *");
                  return a * method2(a - 1);//获取下一个被乘的数字(n-1)
              }
          }
      //--------------------------------------------------
          //定义两个数相加
          public static int method(int a) {
              if (a == 1) {
                  return 1;//出口
              } else {
                  return a + (method(a - 1));
              }
          }
      //--------------------------------------------------
          //最大公约数数辗转相除法
          //辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
          public static int MaxDivisor(int a, int b) {
              int max = a > b ? a : b;
              int min = a < b ? a : b;
              if (max % min != 0) {
                  return MaxDivisor(max, max % min);
              } else {
                  return min;//出口
              }
          }
      
          public static int MinMultiple(int a, int b) {
              //最小公倍数就是他们的乘积除以最大公约数
              return a * b / MaxDivisor(a, b);
          }
      
      }
      
  • 相关阅读:
    第三次作业
    C语言第二次作业
    第一次作业
    C语言第六次作业
    C语言第五次作业
    C语言第四次作业
    C语言第三次作业
    C语言第二次作业
    C语言第一次作业
    C语言学习笔记(6)
  • 原文地址:https://www.cnblogs.com/zk2020/p/14136378.html
Copyright © 2011-2022 走看看