递归算法的应用

来源:互联网 发布:莫知我哀的莫的用法 编辑:程序博客网 时间:2024/05/29 13:04


—递归—

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


—汉诺塔—

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;}



原创粉丝点击