1.概念:程序调用自身的编程技巧称为递归,简单说在java中就是在某个方法中调用自身方法
2.使用场景:
2.1:例如遍历某个文件夹下的所有子文件夹和文件,注意不只是子文件夹,还有其后代的后代,通俗讲就是把他的儿子孙子,重孙。。。全部遍历出来
2.2:在项目中经常会使用到树形结构,那通过顶级的节点,获取其所有子孙节点也是需要递归的
3.使用(基于树形结构的项目实例)
例子1:
public interface DataTree {
public Integer getId();
public Integer getPid() ;
}
/**
* 通过父id,获取他下面的所有子孙id
* @param idList 结果集
* @param osList 所有的节点集合
* @param pid 父id
* @return
*/
public static <T extends DataTree> List<Integer> getChildIds( List<Integer> idList, List<T> osList, int pid){
System.out.println("运行了"); //1
for(T os: osList){ //2
//遍历出父id等于参数的id,add进子节点集合
if(os.getPid()==pid){ //3
//递归遍历下一级
getChildIds(idList,osList,os.getId()); //4
idList.add(os.getId()); //5
}
}
return idList; //6
}
有三个参数:
idList是用来放结果的,这个是必须有的,你可以将其看成一个全局变量,由于递归会不停的调用自身,所以结果集是不能写在方法里面的
osList:是所有的节点信息,用来和父节点作比较
为了方便解释流程,将代码的每一步标上了数字:
1->2>3->4(假设有子节点,第一层) ->1->2->3->4(假设依然有子节点,第二层) ->1->2-3->2->3->2->3...(假设遍历完osList后依然没有子节点,第三层) ->6(在第三层直接return,返回继续执行第二层) ->5->2->3->2->3...(假设第二层只有一个子节点,即之后没有再遇到子节点) ->6(再第二曾return,返回继续执行第一层) ->5>2>3....(如果遇到子节点,则继续向下递归,没有则跳出循环) ->6
仔细思考下流程,其实是可以想明白的