递归应用的简单实例

递归算法是一种直接或者间接地调用自身算法的过程。
递归算法解决问题的特点:
  (1) 递归就是在过程或函数里调用自身。
  (2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
  (3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。

实例说明,前台需要一个关于各级地区的目录树。在后台组织数据时,从上往下,需要为每一级找到他的下级地区,并建立关联关系。为了简化程序设计,这里采用递归算法来实现不限层次的查询和数据装配。

/**
* 级联查询,根据指定的code集合,获得这些区域列表(每个区域包含下级区域)
* @author llf
* @param codes 指定的区域code数组
* @return
*/
@Override
public List<CatalogTree> findCatalogByCascade(String[] codes) {
logger.info("开始行政区域的级联查询……");
List<CatalogTree> totals = new ArrayList<CatalogTree>();
for (int i = 0; i < codes.length; i++) {
CatalogTree c = getCatalogTreeByRegoncode(codes[i]);
//为区域配置下级区域集合
c = getSelfAndChildren(c); //应用递归方法
totals.add(c);
}
return totals;
}

/**
* 递归区域对象,为其配置下属区域集合
* @author llf
* @param node
* @return
*/
private CatalogTree getSelfAndChildren(CatalogTree node){
CatalogTree ct = node;
List<CatalogTree> children = getCatalogTreeByPreRegoncode(ct.getRegoncode());
List<CatalogTree> childs = new ArrayList<CatalogTree>();
if(null!=children && children.size()>0){
for(CatalogTree c : children){
//logger.info(c.getRegonname()+"=="+c.getRegoncode());
c = getSelfAndChildren(c); //注意,开始递归,自己调用自己
childs.add(c);
}
ct.setChildren(childs);
}
return ct;
}

/**
* 将区域列表封装成适合界面展示的节点树
* @author llf
*/
public List<TreeVo> makeCatalogTree(List<CatalogTree> srcList,HttpServletRequest request) {
List<TreeVo> treeNodes1 = new ArrayList<TreeVo>();
for (int i = 0; i < srcList.size(); i++) {//迭代产生一级节点
CatalogTree ct1 = srcList.get(i);
TreeVo node1 = new TreeVo();
node1.setText(ct1.getRegonname());
node1.setId(ct1.getRegoncode());
node1.setIconCls(Constants.CLS_ORGANIZE);//"icon-user"
node1.setChecked("none");
if(null!=ct1.getChildren()){
node1.setLeaf(false);
List<TreeVo> treeNodes2 = new ArrayList<TreeVo>();
for(CatalogTree ct2 : ct1.getChildren()){//迭代产生二级节点
TreeVo node2 = new TreeVo();
node2.setText(ct2.getRegoncode());
node2.setText(ct2.getRegonname());
node2.setIconCls("icon-user");
node2.setChecked("none");
if(null!=ct2.getChildren()){
node2.setLeaf(false);
List<TreeVo> treeNodes3 = new ArrayList<TreeVo>();
for(CatalogTree ct3 : ct2.getChildren()){
TreeVo node3 = new TreeVo();
node3.setId(ct3.getRegoncode());
node3.setText(ct3.getRegonname());
node3.setIconCls("icon-user");
node3.setChecked("none");
node3.setLeaf(true);
treeNodes3.add(node3);
}
node2.setChildren(treeNodes3);
}
treeNodes2.add(node2);
}
node1.setChildren(treeNodes2);
}
treeNodes1.add(node1);
}
return treeNodes1;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值