在循环内部调用递归怎么理解,求解答

private void tree(Set articles,Connection conn,int id,int grade){
String sql="select * from article where pid="+id;
Statement stmt=DB.createStmt(conn);
ResultSet rs=DB.executQuery(stmt, sql);

try{
while(rs.next()){
    Article a=new Article();
    a.setId(rs.getInt("id"));
    a.setPid(rs.getInt("pid"));
    a.setRootid(rs.getInt("rootid"));
    a.setTitle(rs.getString("title"));
    a.setLeaf(rs.getInt("isleaf")==0?true:false);
    a.setPdate(rs.getTime("pdate"));
    a.setGrade(grade);
    articles.add(a);
    if(!a.isLeaf()){
    tree(articles, conn, rs.getInt("id"), grade+1);

    }
}

这个问题是产生一个树形结构,可是我不是很理解这段代码,那个article就是get set方法,pid就是父节点,rootid就是根节点,isleaf就是是否叶子节点,这么写之后我测试报错,还请各位大神指点迷津

package com.bjsxt.bbs;

import java.util.Date;

public class Article {
private int id;
private int pid;
private int rootid;
private String title;
private String cont;
private Date pdate;
private boolean isLeaf;
private int grade;
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public int getRootid() {
return rootid;
}
public void setRootid(int rootid) {
this.rootid = rootid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getCont() {
return cont;
}
public void setCont(String cont) {
this.cont = cont;
}
public Date getPdate() {
return pdate;
}
public void setPdate(Date pdate) {
this.pdate = pdate;
}
public boolean isLeaf() {
return isLeaf;
}
public void setLeaf(boolean isLeaf) {
this.isLeaf = isLeaf;
}

}

小白个人感觉是递归(深度搜索)寻找所有的(不同层数)id相同的article,假如不是叶子,那么继续寻找下一层,如果是叶子,就返回上一层可以寻找其他符合条件的article,不过我猜测如果id和Grade为联合主键,否则如果id为主键会重复,不太对

不好意思,刚才没看见后来的两条补充,个人感觉就是从第一层开始进行深度搜索,在节点为1的地方查询是否为id相同的节点,这段代码好像是一直查询直到遍历过所有的节点之后才停止。(要是每一层有相同的id就无视后面这句话)但是个人感觉如果不是每一层有相同的id那么就没有遍历的必要,直接while判断rs是否为空,如果是空继续下一层,如果有结果就没有必要继续递归了

insert into article values (1, 0, 1, '蚂蚁大战大象', '蚂蚁大战大象',sysdate, 1);
insert into article values (2, 1, 1, '大象被打趴下了', '大象被打趴下了',sysdate, 1);
insert into article values (3, 2, 1, '蚂蚁也不好过','蚂蚁也不好过', sysdate, 0);
insert into article values (4, 2, 1, '瞎说', '瞎说', sysdate, 1);
insert into article values (5, 4, 1, '没有瞎说', '没有瞎说', sysdate, 0);
insert into article values (6, 1, 1, '怎么可能', '怎么可能', sysdate, 1);
insert into article values (7, 6, 1, '怎么没有可能', '怎么没有可能', sysdate, 0);
insert into article values (8, 6, 1, '可能性是很大的', '可能性是很大的', sysdate, 0);
insert into article values (9, 2, 1, '大象进医院了', '大象进医院了', sysdate, 1);
insert into article values (10, 9, 1, '护士是蚂蚁', '护士是蚂蚁', sysdate, 0);

这些是数据库部分代码,因为在oracle我不会设置id自增,所以我直接赋值了,字段分别是id,pid,rootid,title,cont,pdate,isleaf

递归就是自己调用自己

你这个是在遍历的时候,根据条件
if(!a.isLeaf())
{
tree(articles, conn, rs.getInt("id"), grade+1);
}