Java 递归调用 recursive 给一个参数 返回一大堆

Posted 三目鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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文件;

再问一个问题:  这种递归调用 可以 使用 尾递归 优化么?  

不可以 : 遍历的缘故 .

 

以上是关于Java 递归调用 recursive 给一个参数 返回一大堆的主要内容,如果未能解决你的问题,请参考以下文章

解决递归问题的四部曲-java面试题

解决递归问题的四部曲-java面试题

Java数据结构与算法——递归与回溯

C++基础教程——递归( recursion)

javascript 递归函数调用(recursive funciton call)

拾遗:关于“尾递归”——tail recursive