0
点赞
收藏
分享

微信扫一扫

递归和数组的介绍

松鼠树屋 2022-04-27 阅读 62
java

目录

1.方法递归

1.1例子:用递归实现5!

2.数组

2.1数组的定义: 

2.2数组的创建和初始化

2.3数组的使用

 2.4数组的遍历

2.5数组作为方法的参数

2.6认识 null

3.JAVA中的内存划分(栈,堆)

3.1栈空间:

3.2堆空间:


1.方法递归

      定义:方法自己调用自己的过程叫方法递归。(注意方法的语义)

      使用场景:a) 一个大问题可以拆分为若干个子问题。

                        b) 原问题和子问题除了数据规模不一样外,求解思路完全一样。

                        c) 存在递归终止条件,即问题的出口。

1.1例子:用递归实现5!

(1)用逆向思维求解,要求factor(5),先求factor(4) ,以此类推。

(2)factor(5) = 5 * factor(4) 这样推下去,要先求出factor(1)。

 public static void main(String[] args) {
        int num = 5;
        System.out.println(factor(num));
    }
    //写一个递归函数实现5!
    //注意方法的语义
    public static int factor(int num){
        //先写终止条件
        if (num == 1){
            return num;
        }
        return num * factor(num - 1);
    }

2.数组

2.1数组的定义: 

数组的本质就是能 "批量" 创建相同类型的变量,即数组中包含的变量必须是 相同类型。

注意:数组是顺序表结构。

2.2数组的创建和初始化

动态初始化:
数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };
静态初始化:
数据类型[] 数组名称 = { 初始化数据 };

 //定义一个长度为三的数组
        int[] arr = new int[3];
        int[] arr1 = new int[]{1,2,3};
        int[] arr3 = {1,2,3};

注意事项: 静态初始化的时候, 数组元素个数和初始化数据的格式是一致的

2.3数组的使用

 int[] arr = new int[3];
        int[] arr1 = new int[]{1,2,3};
        int[] arr3 = {1,2,3};
        System.out.println(arr.length);//获取数组长度
        System.out.println(arr1[1]); 
        System.out.println(arr1[0]);
        System.out.println(arr1[arr3.length]); //数组访问越界

1. 使用 arr.length 能够获取到数组的长度. . 这个操作为成员访问操作符. 在面向对象中会经常用到.
2. 使用 [ ] 按下标取数组元素. 需要注意, 数组的下标都是从 0 开始。
3. 使用 [ ] 操作既能读取数据, 也能修改数据.
4. 下标访问操作不能超出有效范围 [0, length - 1] , 如果超出有效范围, 会出现下标越界异常。

 2.4数组的遍历

定义;是指将数组中的所有元素依次都访问一遍, 不重不漏. 

简单for循环遍历:

 
        int[] arr = new int[]{1,2,3};
        //取出数组元素并打印
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
            
        }

for-each循环:

语法:for(临时变量,数组名称)

for (int i : arr ) {
            System.out.print(i + ",");
        }

当只需要访问数组元素,但不修改的情况下,可以使用for-each循环。mei'zou'yi

2.5数组作为方法的参数

(1)值传递:swap方法只是将main方法中的a,b的值拷贝一份。

public static void main(String[] args) {
        int a = 10;
        int b = 20;
        swap(a,b);
        System.out.print(a + "," + b);
        
    }
    //方法实现值传递
    public static void swap(int a, int b){
        int tmp = b;
        b = a;
        a = tmp;
    }

(2)借助数组交换数字:借助数组交换数字时,int[] arr1 中的arr1存储的是数组的地址(起始位置的地址)

public static void main(String[] args) {

        int[] arr1 = new int[]{10,20};
        swap(arr1);
        System.out.print(arr1[0] + "," + arr1[1]);
 

    }
       public static void swap(int[] arr1){
        int tmp = arr1[0];
        arr1[0] = arr1[1];
        arr1[1] = tmp;

       }

注意:(1)程序中的所有数据在内存中保存。

          (2)当传参的时候, 是按在函数内部修改数组内容, 函数外部也发生改变。

          (3) 所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续                      进行数组参数传参, 其实只是将数组的地址传入到函数形参中。

          (4)有new就有新空间。

2.6认识 null

定义:null 在 Java 中表示 "空引用" , 也就是一个无效的引用

当一个引用变量被赋值为null时,表示此变量不保存任何地址,因此无法使用该变量进行操作。

一旦尝试读写, 就会抛出 NullPointerException.

3.JAVA中的内存划分(栈,堆)

3.1栈空间:

保存的是函数中局部变量(包括方法中的形参和实参)

public static void 方法名称(方法参数-形参){

             int a = 10;           // (实参)

}

3.2堆空间:

所有new的对象都在堆空间

栈和堆的存储方式如下:

 

举报

相关推荐

0 条评论