【JavaSE】Java基础语法(二十三):递归与数组的高级操作

简介: 1. 递归1.1 递归递归的介绍以编程的角度来看,递归指的是方法定义中调用方法本身的现象把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算

1. 递归

1.1 递归

  • 递归的介绍
  • 以编程的角度来看,递归指的是方法定义中调用方法本身的现象
  • 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
  • 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
  • 递归的基本使用
public class MyFactorialDemo2 {
  public static void main(String[] args) {
    int sum = getSum(100);
    System.out.println(sum);
  }
  private static int getSum(int i) {
    //1- 100之间的和
    //100 + (1-99之间的和)
    // 99 + (1- 98之间的和)
    //....
    //1
    //方法的作用: 求 1- i 之间和
    if(i == 1){
      return 1;
    }else{
      return i + getSum(i -1);
    }
  }
}
  • 递归的注意事项
  • 递归一定要有出口。否则内存溢出
  • 递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出


1.2 递归求阶乘

  • 案例需求
  • 用递归求5的阶乘,并把结果在控制台输出
  • 代码实现
public class DiGuiDemo01 {
  public static void main(String[] args) {
    //调用方法
    int result = jc(5);
    //输出结果
    System.out.println("5的阶乘是:" + result);
  }
  //定义一个方法,用于递归求阶乘,参数为一个int类型的变量
  public static int jc(int n) {
    //在方法内部判断该变量的值是否是1
    if(n == 1) {
      //是:返回1
      return 1;
    } else {
      //不是:返回n*(n-1)!
      return n*jc(n-1);
    }
  }
}

2. 数组的高级操作

2.1 二分查找

  • 二分查找概述
    查找指定元素在数组中的位置时,以前的方式是通过遍历,逐个获取每个元素,看是否是要查找的元素,
    这种方式当数组元素较多时,查找的效率很低
    二分查找也叫折半查找,每次可以去掉一半的查找范围,从而提高查找的效率
  • 需求
    在数组{1,2,3,4,5,6,7,8,9,10}中,查找某个元素的位置


  • 实现步骤
  1. 定义两个变量,表示要查找的范围。默认min = 0 ,max = 最大索引
  2. 循环查找,但是min <= max

计算出mid的值

判断mid位置的元素是否为要查找的元素,如果是直接返回对应索引

如果要查找的值在mid的左半边,那么min值不变,max = mid -1.继续下次循环查找

如果要查找的值在mid的右半边,那么max值不变,min = mid + 1.继续下次循环查找

当min > max 时,表示要查找的元素在数组中不存在,返回-1.

  • 代码实现
public class MyBinarySearchDemo {
  public static void main(String[] args) {
    int [] arr = {1,2,3,4,5,6,7,8,9,10};
    int number = 11;
    //1,我现在要干嘛? --- 二分查找
    //2.我干这件事情需要什么? --- 数组 元素
    //3,我干完了,要不要把结果返回调用者 --- 把索引返回给调用者
    int index = binarySearchForIndex(arr,number);
    System.out.println(index);
  }
  private static int binarySearchForIndex(int[] arr, int number) {
    //1,定义查找的范围
    int min = 0;
    int max = arr.length - 1;
    //2.循环查找 min <= max
    while(min <= max){
      //3.计算出中间位置 mid
      int mid = (min + max) >> 1;
      //mid指向的元素 > number
      if(arr[mid] > number){
        //表示要查找的元素在左边.
        max = mid -1;
      }else if(arr[mid] < number){
        //mid指向的元素 < number
        //表示要查找的元素在右边.
        min = mid + 1;
      }else{
        //mid指向的元素 == number
        return mid;
      }
    }
    //如果min大于了max就表示元素不存在,返回-1.
    return -1;
  }
}

注意事项

有一个前提条件,数组内的元素一定要按照大小顺序排列,如果没有大小顺序,是不能使用二分查

找法的


2.2 冒泡排序

  • 冒泡排序概述
    一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序
    如果有n个数据进行排序,总共需要比较n-1次 每一次比较完毕,下一次的比较就会少一个数据参与
  • 代码实现
public class MyBubbleSortDemo2 {
  public static void main(String[] args) {
    int[] arr = {3, 5, 2, 1, 4};
    //1 2 3 4 5
    bubbleSort(arr);
  }
  private static void bubbleSort(int[] arr) {
    //外层循环控制的是次数 比数组的长度少一次.
    for (int i = 0; i < arr.length -1; i++) {
      //内存循环就是实际循环比较的
      //-1 是为了让数组不要越界
      //-i 每一轮结束之后,我们就会少比一个数字.
      for (int j = 0; j < arr.length - 1 - i; j++) {
        if (arr[j] > arr[j + 1]) {
          int temp = arr[j];
          arr[j] = arr[j + 1];
          arr[j + 1] = temp;
        }
      }
    }
      printArr(arr);
    }
    private static void printArr(int[] arr) {
      for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
      }
      System.out.println();
    }
}

2.3 快速排序

  • 快速排序概述
    冒泡排序算法中,一次循环结束,就相当于确定了当前的最大值,也能确定最大值在数组中应存入的位置 快速排序算法中,每一次递归时以第一个数为基准数,找到数组中所有比基准数小的.再找到所有比基准数大的.小的全部放左边,大的全部放右边,确定基准数的正确位置
  • 核心步骤
  1. 从右开始找比基准数小的
  2. 从左开始找比基准数大的
  3. 交换两个值的位置
  4. 红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
  5. 基准数归位
  • 代码实现
 public  clapublic class MyQuiteSortDemo2 {
  public static void main(String[] args) {
    // 1,从右开始找比基准数小的
    // 2,从左开始找比基准数大的
    // 3,交换两个值的位置
    // 4,红色继续往左找,蓝色继续往右找,直到两个箭头指向同一个索引为止
    // 5,基准数归位
    int[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 10, 8};
    quiteSort(arr,0,arr.length-1);
    for (int i = 0; i < arr.length; i++) {
      System.out.print(arr[i] + " ");
    }
  }
  private static void quiteSort(int[] arr, int left, int right) {
    // 递归结束的条件
    if(right < left){
      return;
    }
    int left0 = left;
    int right0 = right;
    //计算出基准数
    int baseNumber = arr[left0];
    while(left != right){
      // 1,从右开始找比基准数小的
      while(arr[right] >= baseNumber && right > left){
        right--;
      }
      // 2,从左开始找比基准数大的
      while(arr[left] <= baseNumber && right > left){
        left++;
      }
      // 3,交换两个值的位置
      int temp = arr[left];
      arr[left] = arr[right];
      arr[right] = temp;
    }
    //基准数归位
    int temp = arr[left];
    arr[left] = arr[left0];
    arr[left0] = temp;
    // 递归调用自己,将左半部分排好序
    quiteSort(arr,left0,left-1);
    // 递归调用自己,将右半部分排好序
    quiteSort(arr,left +1,right0);
  }
}

2.4 Arrays (应用)

  • Arrays的常用方法

ebc56a94e73947e98d04127a2c433500.png

  • 示例代码
public class MyArraysDemo {
  public static void main(String[] args) {
  // public static String toString(int[] a) 返回指定数组的内容的字符串
  表示形式
  // int [] arr = {3,2,4,6,7};
  // System.out.println(Arrays.toString(arr));
  // public static void sort(int[] a) 按照数字顺序排列指定的数组
  // int [] arr = {3,2,4,6,7};
  // Arrays.sort(arr);
  // System.out.println(Arrays.toString(arr));
  // public static int binarySearch(int[] a, int key) 利用二分查找返回指
  定元素的索引
  int [] arr = {1,2,3,4,5,6,7,8,9,10};
  int index = Arrays.binarySearch(arr, 0);
  System.out.println(index);
  //1,数组必须有序
  //2.如果要查找的元素存在,那么返回的是这个元素实际的索引
  //3.如果要查找的元素不存在,那么返回的是 (-插入点-1)
  //插入点:如果这个元素在数组中,他应该在哪个索引上.
  }
}
  • 工具类设计思想
  1. 构造方法用 private 修饰
  2. 成员用 public static 修饰

相关文章
|
7月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
198 1
|
7月前
|
Java
Java 数组学习笔记
本文整理Java数组常用操作:遍历、求和、查找、最值及二维数组行求和等典型练习,涵盖静态初始化、元素翻倍、去极值求平均等实例,帮助掌握数组基础与应用。
|
7月前
|
存储 SQL NoSQL
Redis-常用语法以及java互联实践案例
本文详细介绍了Redis的数据结构、常用命令及其Java客户端的使用,涵盖String、Hash、List、Set、SortedSet等数据类型及操作,同时提供了Jedis和Spring Boot Data Redis的实战示例,帮助开发者快速掌握Redis在实际项目中的应用。
566 1
Redis-常用语法以及java互联实践案例
|
8月前
|
存储 缓存 Java
Java数组全解析:一维、多维与内存模型
本文深入解析Java数组的内存布局与操作技巧,涵盖一维及多维数组的声明、初始化、内存模型,以及数组常见陷阱和性能优化。通过图文结合的方式帮助开发者彻底理解数组本质,并提供Arrays工具类的实用方法与面试高频问题解析,助你掌握数组核心知识,避免常见错误。
|
8月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
516 0
|
8月前
|
存储 Java 容器
Java基本语法详解
本文深入讲解了Java编程的基础语法,涵盖数据类型、运算符、控制结构及数组等核心内容,帮助初学者构建坚实的编程基础。
|
9月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
398 3
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
9月前
|
存储 Java 索引
java 数组
在 Java 中,数组是一种数据结构,用于存储多个相同类型的数据元素。数组的大小一旦创建后就不能改变,因此它是固定长度的。Java 数组是一种 对象,即使它存储的值是基本类型(如 int、double 等),它也是一个对象引用。
216 0
|
9月前
|
存储 安全 Java
从基础语法到实战应用的 Java 入门必备知识全解析
本文介绍了Java入门必备知识,涵盖开发环境搭建、基础语法、面向对象编程、集合框架、异常处理、多线程和IO流等内容,结合实例帮助新手快速掌握Java核心概念与应用技巧。
225 0
下一篇
开通oss服务