递归算法的应用


—递归—

  递归做为一种算法程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回(递归简单说就是程序调用自身的编程技巧。)


—汉诺塔—

public class super1{
         static int count=1;
           public static void move(char j,char k){
              System.out.println("第"+(super1.count++)+"步:把一个杯子从桌子"+j+"拿到杯子"+k);
           }
           public static void hanoi(char a,char b,char c,int n){
          if(n==1)move(a,c);
           else{hanoi(a,c,b,n-1);
              move(a,c);
              hanoi(b,a,c,n-1);
           }
        }
       public static void main(String[] args){
           char a='A',b='B',c='C';
           int num=3;//杯子的个数
           hanoi(a,b,c,num);
        }
    }


—递归树—


List<EpvPvModulesBo> bos = page.getList();
	List<EpvPvModulesBo> allNode=null;  //所有子节点
	List<EpvPvModulesBo> node=new ArrayList<EpvPvModulesBo>();//子节点
	for (EpvPvModulesBo bo : bos) {
		allNode = mapper.getLeafByCmd(bo.getOption_cmd());//所有子节点
		if(allNode!=null && allNode.size()!=0){
			
			recursionNode(allNode, bo);
			
		}
	}

/**
 * 
 * @Description: 
 * @author Leesire
 * @param bos:一级点下的所有字节点
 * @param bo 
 * @date: 2017-8-5 上午9:57:18
 */
private void recursionNode(List<EpvPvModulesBo> bos,EpvPvModulesBo bo) {
	
	List<EpvPvModulesBo> childList = getChildList(bos, bo);// 得到子节点列表
	if (hasChild(bos, bo)) {// 判断是否有子节点,加入有子节点继续递归子节点。

		Iterator<EpvPvModulesBo> it = childList.iterator();
		 while (it.hasNext()) {
			 EpvPvModulesBo n = (EpvPvModulesBo) it.next();
			 recursionNode(bos, n);
		 }
	}
}

/**
 * 
 * @Description: 得到子节点列表
 * @author Leesire
 * @param list
 * @param bo:父节点
 * @return 
 * @date: 2017-8-5 上午9:51:22
 */
private List<EpvPvModulesBo> getChildList(List<EpvPvModulesBo> list, EpvPvModulesBo bo) {
	List<EpvPvModulesBo> nodeList = new ArrayList<EpvPvModulesBo>();
	if(list!=null && list.size()!=0){
		for (EpvPvModulesBo noBo : list) {
			if(noBo.getParent_module_id()!=null && !"".equals(noBo.getParent_module_id()) && 
					noBo.getParent_module_id().equals(bo.getModule_id())){
				
				nodeList.add(noBo);
			}
		}
		bo.setNode(nodeList);
	}
	return nodeList;
}

/**
 * 
 * @Description: 判断是否有子节点
 * @author Leesire
 * @param list
 * @param bo:父节点
 * @return 
 * @date: 2017-8-5 上午9:51:11
 */
private boolean hasChild(List<EpvPvModulesBo> list, EpvPvModulesBo bo) {
	return getChildList(list, bo).size() > 0 ? true : false;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值