递归与 数组操作理解

递归

这个名词怎么解释呢? 在程序中程序调用自身的编程技巧称为递归,这样也是比较好理解的,首先递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂问题,同时可以让代码变得简洁,举一个栗子

package com.haiyan.test;
/**递归demo*/
public class demo {
    public static void main(String[] args) {
        demo t=new demo();
       int a= t.ss(5);
       System.out.println(a);
    }

    public int ss(int num){
        if(num==0){
            return 1;
        }
        int ss=ss(num-1)*5;
        int s1=ss(num-1)*5;
        return  ss;  //最终得出  3125
  }
}

这个3125是怎么得出的呢?

391102d914b21001834719cab4b9885.png
需要注意事情是,递归中一定要做数据if判断值校验,否则会变成死循环,这里只是举一个简单易懂的例子,当然了还有很多其他情况也是可以使用的,例如阶乘,递减,递增 或者是其它调用操作也是可以用次数控制判断调用处理其他逻辑的,看情况而定,这里只是写的没有复杂情况下的示例

数组

在某些情况下,虽然可以使用单个变量来存储信息,但是如果需要存储的信息较多(例如存储 50 名学生的成绩),这时再依次创建变量声明并赋值显得非常麻烦。

随着处理的信息量越来越大,工作也就越来越烦琐,这时可以使用数组或集合来存储信息。通过使用数组,可以在很大程度上缩短和简化程序代码,从而提高应用程序的效率。
Java 中的数组是引用数据类型,它的长度属性是 length,String 也是引用类型,在操作数组的时候切记要做空的判断啊,不然会空指针异常,数组的下标是从0开始的,创建一个数组

有很多种创建方式

String aaa[] = new String[5]; /*开辟了一个长度为5的数组*/
aaa[0] = "10"; // 第一个元素
aaa[1] = "20"; // 第二个元素
aaa[2] = "30"; // 第三个元素
String [] arr={"10","20","30"};
    public static void main(String[] args) {
        String aaa[] = new String[5]; /*开辟了一个长度为5的数组*/
        aaa[0] = "10"; // 第一个元素
        aaa[1] = "20"; // 第二个元素
        aaa[2] = "30"; // 第三个元素
        for(int i = 0; i < aaa.length; i++) {
            if(aaa[i]!=null){
                System.out.println(aaa[i]); //通过循环控制索引
            }
        }
    }
}

因为数组是引用类型,和我们平时操作的类对象是有点类似的,所以当我把这个aaa[] 赋值给 vvv[] 的时候那么当vvv被修改时,aaa中的数据也将会被修改,赋值的时候是地址拷贝

public static void main(String[] args) {
    String aaa[] = new String[5]; /*开辟了一个长度为5的数组*/
    aaa[0] = "10"; // 第一个元素
    aaa[1] = "20"; // 第二个元素
    aaa[2] = "30"; // 第三个元素
    String vvv[]=aaa;
      vvv[vvv.length-3]="11";

    for(int i = 0; i < aaa.length; i++) {
        if(aaa[i]!=null){
            System.out.println(aaa[i]); //通过循环控制索引
        }
    }
}

这个aaa在输出aaa[2] = “30”; 不在等于30了 而是等于11 说vvv修改后aaa也受到影响,怎么解决这个问题呢?

    public static void main(String[] args) {
        String aaa[] = new String[5]; /*开辟了一个长度为5的数组*/
        aaa[0] = "10"; // 第一个元素
        aaa[1] = "20"; // 第二个元素
        aaa[2] = "30"; // 第三个元素
        String vvv[]=new String[5];;
        for(int i = 0; i < aaa.length; i++) {
            if(aaa[i]!=null){
                vvv[i]=aaa[i];
                if( aaa[aaa.length-3].equals("30")){
                    vvv[i]="22";
                    System.out.println(aaa[i]);
                }
                System.out.println(aaa[i]); //通过循环控制索引
            }
        }
    }
}

如果有需要,但是又不想原来的收到影响,可以创建一个新的数字,以值拷贝的方式赋值给vvv,删除的话就是将下标找到直接赋值为null就行了,如果是int类型的数组找到下标赋值为0,,二维数组的话和一维数组的操作是一样的,只是多了一层维度 名称[0][0] 名称[0][1],就是原来本来是一个数组值得位置指向了一个新得数组,在内存中也是引用对应的,一对多的感觉 访问和循环方式是不变的
上面代码里用找下标的方式新增显然是不合适的,因为那是在知道还有空间的情况下,那如果是用于需求上面,我多写入一个变会报错了,那么怎么动态扩容呢?

public static void main(String[] args) {
    //要求:实现动态的给数组添加元素效果,实现堆数组的扩容,ArrayAdd.java
    //1,原始数组使用静态分配 int [] arr={10,20,30};
    //动态增加元素,直接放再数组的最后, arr={10,20,30,40}
    //用户可以通过如下方法来决定是否继续添加,添加成功,是否继续?Y/N
    //思路:
    // 定义一个新的数组,int[] arrNew=new int[arr.length+1]
    //遍历arr数组,依次将arr的元素拷贝到arrNew数组,将4赋给arrNew[arr.length-1]
    //让arr 指向arrNew; arr=arrNew;那么原来arr数组就被销毁了
    //创建一个Scanner可以接受用户输入
    Scanner a=new Scanner(System.in);
    //初始化数组
    int [] arr={10,20,30};
    do {
        int[] arrNew = new int[arr.length + 1];
        for (int i = 0; i < arr.length; i++) {
            arrNew[i] = arr[i];
        }
        System.out.println("请输入要添加的元素");
        arrNew[arr.length - 1] = a.nextInt();
        System.out.println("=========扩容后元素");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + "\t");
        }
        System.out.println("是否继续 y/n");
        char key =a.next().charAt(0);
        if(key=='n'){
            break;
        }
    }while (true);
}

数组扩容是非常慢的,每次都要开辟新的数组还要拷贝(数据结构中的链表是可以解决这个问题的,下一章在写吧),还有动态缩减,也可以根据上面的例子来进行复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值