Java 递归调用 recursive 给一个参数 返回一大堆
需求: 需要组装成对象多层嵌套式的 json字符串;
想到使用 递归来完成这个多层嵌套:
憋了四个小时,终于写出来了;
先看效果:
数据库中的数据:
拼装后的效果:
[ EmpVO{ ename='孙老三1', empno=10, mgr=0, subordinates=[ EmpVO{ ename='KING', empno=7839, mgr=10, subordinates=[ EmpVO{ ename='JONES', empno=7566, mgr=7839, subordinates=[ EmpVO{ ename='SCOTT', empno=7788, mgr=7566, subordinates=[ EmpVO{ ename='ADAMS', empno=7876, mgr=7788, subordinates=null } ] }, EmpVO{ ename='FORD', empno=7902, mgr=7566, subordinates=[ EmpVO{ ename='SMITH', empno=7369, mgr=7902, subordinates=null } ] } ] }, EmpVO{ ename='BLAKE', empno=7698, mgr=7839, subordinates=[ EmpVO{ ename='ALLEN', empno=7499, mgr=7698, subordinates=null }, EmpVO{ ename='WARD', empno=7521, mgr=7698, subordinates=null }, EmpVO{ ename='MARTIN', empno=7654, mgr=7698, subordinates=null }, EmpVO{ ename='TURNER', empno=7844, mgr=7698, subordinates=null }, EmpVO{ ename='JAMES', empno=7900, mgr=7698, subordinates=null } ] }, EmpVO{ ename='CLARK', empno=7782, mgr=7839, subordinates=[ EmpVO{ ename='MILLER', empno=7934, mgr=7782, subordinates=null } ] } ] } ] }, EmpVO{ ename='陈老五1', empno=20, mgr=0, subordinates=[ EmpVO{ ename='1', empno=200, mgr=20, subordinates=[ EmpVO{ ename='钱老二', empno=2000, mgr=200, subordinates=null } ] } ] }, EmpVO{ ename='zas1', empno=30, mgr=0, subordinates=[ EmpVO{ ename='陈生', empno=300, mgr=30, subordinates=[ EmpVO{ ename='李四', empno=3000, mgr=300, subordinates=null } ] } ] } ]
上代码:
public class RecursiveDemo { EmpService service = new EmpService(); public static void main(String[] args) throws SQLException, ClassNotFoundException { EmpVO emp = new EmpVO(); RecursiveDemo rd = new RecursiveDemo(); List<EmpVO> l = rd.recursive21(0); System.out.println(l); } List<EmpVO> recursive21(int mgr) throws SQLException, ClassNotFoundException { List<EmpVO> l = null; List<EmpVO> subordinates = service.getEmpsByMgr(mgr); if (subordinates != null && subordinates.size() > 0) { l = new ArrayList<EmpVO>(); List<EmpVO> list = null; for (EmpVO empvo : subordinates) { list = recursive21(empvo.getEmpno()); empvo.setSubordinates(list); l.add(empvo); } } return l; } }
很有意思的是: 参数和返回结果:
我先后尝试了 : 参数是 emp 返回结果是 emp ; 参数是 list 返回结果是 list ; 参数是emp 返回结果是list ; 终于后来又尝试 参数 int 返回结果list ;
从我对参数和返回结果的预设 可以看出:
开始时 我的理解时: 最终的目标是返回一个对象 ; 所以 返回结果类型是 对象;
又参考 dom4j 遍历 xml 文档 ; 觉得 返回应该是一个list ;
对传入参数的理解 : 刚开始也是不对的 ; 认为可能是 list 或者 对象 ;
后来 又 参考 dom4j 遍历 xml 文档 : 觉得 参数可能不是一个直接的, 而是一个间接的 ;
综上所述:
递归 最常用的形式可能就是 : 给一个 返回一大堆 ;
如: Java 递归遍历文件夹;
如: dom4j递归遍历xml文件;
再问一个问题: 这种递归调用 可以 使用 尾递归 优化么?
不可以 : 遍历的缘故 .