记录一个java递归

一、思路

递归说白了就是自己调自己

定义一个a方法,a方法中的逻辑还要调用a方法

二、代码

public void a() {
    a();
}

此时递归就跑起来了

三、死循环的问题

此时递归会一直进行下去,就造成了死循环

于是要有一个停止递归的条件

public void a() {
    if (xx) {// 添加停止递归的条件
      a();
  }

四、一个简单的案例

调用第三方的接口时,接口数据一般会进行分页处理

此时如果想要一次获取全量数据,就可以使用递归

public class Test001 {

  public static void main(String[] args) {

    Test001 test001 = new Test001();
    List<String> list = new ArrayList<>();
    test001.a(list, 1);
    System.out.println("list = " + list);
  }

  public void a(List<String> list, int pageNumber) {

    // 查询接口获取分页数据
    int count = 41;
    int pageSize = 20;
    System.out.println("第"+pageNumber+"页,"+pageSize+"条。");

    list.add("20条");

    if (count > pageNumber * pageSize) { // 最后一页停止递归
      pageNumber++;
      a(list, pageNumber);
    }
  }
}

五、要注意的两点事情

1、注意递归逻辑中产生很多对象,可能导致内存溢出

public class Test001 {

  public static void main(String[] args) {

    Test001 test001 = new Test001();
    List<String> list = new ArrayList<>();
    test001.a(list, 1);
    System.out.println("list = " + list);
  }

  public void a(List<String> list, int pageNumber) {

    // 查询接口获取分页数据

    // 为请求第三方接口构建的数据
    AAA aaa = new AAA();


    int count = 41;
    int pageSize = 20;
    System.out.println("传入"+aaa+"条件,获取第"+pageNumber+"页,"+pageSize+"条。");

    list.add("20条");

    if (count > pageNumber * pageSize) { // 最后一页停止递归
      pageNumber++;
      a(list, pageNumber);
    }
  }
}

此时递归中为请求第三方接口构建了一些查询条件

创建的对象会随着程序递归的次数越来越多

我们完全可以将一些不变的条件在递归外面构建一次作为参数传递到递归方法

避免创建对象过多导致的内存溢出问题

public class Test001 {

  public static void main(String[] args) {

    Test001 test001 = new Test001();
    List<String> list = new ArrayList<>();

    // 为请求第三方接口构建的数据
    AAA aaa = new AAA();

    test001.a(list, 1, aaa);
    System.out.println("list = " + list);
  }

  public void a(List<String> list, int pageNumber, AAA aaa) {

    // 查询接口获取分页数据

    int count = 41;
    int pageSize = 20;
    System.out.println("传入"+aaa+"条件,获取第"+pageNumber+"页,"+pageSize+"条。");

    list.add("20条");

    if (count > pageNumber * pageSize) { // 最后一页停止递归
      pageNumber++;
      a(list, pageNumber, aaa);
    }
  }
}

2、开启递归

有的时候递归需要给一个开启递归的条件

如上分页递归的代码,main中运行a方法,参数pageNumber是随着每次递归递增的

这样就需要一个启动条件,如代码中从第1页开始查询

  public static void main(String[] args) {

    Test001 test001 = new Test001();
    List<String> list = new ArrayList<>();

    // 为请求第三方接口构建的数据
    AAA aaa = new AAA();

    // pageNumber为1,从第一页开始查询,启动递归
    test001.a(list, 1, aaa);
    System.out.println("list = " + list);
  }
posted @ 2022-10-02 16:14  大列巴同学  阅读(3)  评论(0编辑  收藏  举报  来源