`
ll_feng
  • 浏览: 383542 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

递归应用的简单实例

    博客分类:
  • j2se
 
阅读更多
递归算法是一种直接或者间接地调用自身算法的过程。
递归算法解决问题的特点:
  (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;
	}
}

分享到:
评论

相关推荐

    递归的简单应用和案例

    对于递归的简单应用做的详细解释,里面还有案例,可以通过文件对递归有简单的了解

    递归的应用:最简单分形图形实现

    大家在C/C++学习时都会遇到递归,课本上以汗诺塔为例进行讲解,然后大家都希望自己找到一个递归的实例。本代码以一个最简单的分形图形来示范递归的实现过程。

    递归函数应用实例:用python来画分形树

    函数定义中调用函数自身的方式称为递归(简单说就是自己调用自己) 举个简单例子就是:函数f(x)—–f(f(x)) 既是一个递归调用。 每次函数调用时,函数参数会临时存储,相互没有影响;达到终止条件时,各函数逐层结束...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...

    C语言函数的递归和调用实例分析

     C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。 要点: 1、C语言函数可以递归调用。 2、可以通过直接或间接两种方式调用。目前只讨论直接递归调用。 二、递归条件  ...

    Python语言程序设计教程 北理工Python课程第6章-函数与递归-5-函数实例 共11页.pdf

    【大纲】 0-1-课程内容和安排介绍 1-1-计算机的概念 1-2-程序设计语言概述 1-3-Python语言 1-4-Python开发环境配置 1-5-基本程序设计方法 1-6-理解问题的计算部分 1-7-温度转换程序实例 ...第6章-函数与递归-5-函数实例

    c语言经典源码例子100篇

    第一篇 基础知识篇 实例1 数据类型转换 实例2 转义字符 实例3 关系和逻辑运算 实例4 自增自减 实例5 普通位运算 实例6 位移运算 实例7 字符译码 实例8 指针操作符 实例9 if判断语句 ...实例100 简单专家系统

    Vue递归实现树形菜单方法实例

    什么是树形菜单还是要简单的啰嗦一下,比如: 上图是截图自elementui的实例,实现方式是用文档结构(类似像原生Dom文档结构的写法)的方式,好处就是很灵活,可以方便的自定义,作为一个通用视图组件库这是正确的...

    C程序范例宝典(基础代码详解)

    实例081 结构体简单应用 104 实例082 找最高分 106 实例083 平均成绩 108 实例084 比较计数 109 实例085 信息查询 110 实例086 计算开机时间 111 3.2 链表 112 实例087 创建单向链表 112 实例088 ...

    java范例开发大全

    实例18 Java中的递归 31 实例19 男生女生各多少人 32 实例20 求水仙花数 34 实例21 求任意一个正数的阶乘 35 实例22 求n的n次方 35 实例23 利用for循环输出几何图形 36 实例24 杨辉三角 38 3.3 while语句 39 实例25 ...

    Visual Basic.NET精彩编程百例 李强 源代码

    实例32 简单计算器 实例33 冒泡排序 实例34 进制转换 实例35 中文数字转换 实例36 求解方程 实例37 反转字符串 实例38 查找字符串 实例39 替换字符串 实例40 比较字符串 第三篇 文件操作 实例41 文字处理 ...

    C语言编程精彩百例(附原书源代码)

    基本信息 · 开本: 16 · 出版日期: 2004-01 · 版次: 2004年1月第1版 · 页数: 364 · ISBN: 7508418182 · 国别: 中国大陆 · 出版社: 中国水利水电出版社 · 编者: 温海,等 ...实例100 简单专家系统

    C#递归算法之分而治之策略

    1.分而治之的概念   分而治之是一种使用递归解决问题的算法,主要的技巧是将一个大的复杂的问题划分为多个子问题,而... 画标尺是分而治之的策略的一个简单应用,标尺是由长度为1英寸的单元构成的序列,每个单元的末

    Python语言程序设计教程 北理工Python课程第6章-函数与递归-1-函数定义 共22页.pdf

    【大纲】 0-1-课程内容和安排介绍 1-1-计算机的概念 1-2-程序设计语言概述 1-3-Python语言 1-4-Python开发环境配置 1-5-基本程序设计方法 1-6-理解问题的计算部分 1-7-温度转换程序实例 ...第6章-函数与递归-5-函数实例

    Python语言程序设计教程 北理工Python课程第6章-函数与递归-3-改变参数值的函数 共16页.pdf

    【大纲】 0-1-课程内容和安排介绍 1-1-计算机的概念 1-2-程序设计语言概述 1-3-Python语言 1-4-Python开发环境配置 1-5-基本程序设计方法 1-6-理解问题的计算部分 1-7-温度转换程序实例 ...第6章-函数与递归-5-函数实例

Global site tag (gtag.js) - Google Analytics