`
ll_feng
  • 浏览: 391048 次
  • 性别: 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;
	}
}

分享到:
评论

相关推荐

    递归的简单应用和案例

    ### 递归的简单应用和案例 #### 一、递归的基本概念 递归是一种算法设计技巧,在计算机科学中有着广泛的应用。递归的核心思想是将一个大问题分解成若干个相同类型的子问题来求解,这些子问题的规模比原问题小。...

    一个简单的递归调用的实例

    在这个“一个简单的递归调用的实例”中,我们将深入探讨递归调用在.NET项目中的应用,特别是如何利用递归来遍历目录树。 递归调用的基本思想是,一个问题的解可以分解为一个或多个与原问题相同但规模更小的子问题。...

    栈和递归遍历实例

    在递归过程中,一个问题被分解为一个或多个规模更小的相同问题,直到问题变得足够简单可以直接解决。递归需要一个明确的基线条件(Base Case),以防止无限循环,以及一个递归规则,用于将问题规模逐步减小。 在...

    递归算法的实例与教程

    VB编程实例则可能展示了如何在实际编程中应用递归。例如,可能包含以下几种类型的递归算法: 1. **斐波那契数列**:递归地计算第n个斐波那契数,前两个数为0和1,后面的每个数是前两个数的和。 2. **阶乘计算**:...

    简单递归.txt

    以下是一些典型的递归应用场景: 1. **树的遍历**:在处理XML或HTML文档时,递归可以用于遍历树形结构,提取所需的信息。例如,深度优先搜索(DFS)和广度优先搜索(BFS)都是基于递归实现的。 2. **分治算法**:...

    c# 树形递归实例

    总结一下,本实例主要涉及C#中的树形数据结构、递归算法以及如何将它们应用于实际的GUI控件,如TreeView。通过理解这些概念,你可以更好地处理层次数据,无论是进行遍历、搜索还是构建用户界面。对于初学者来说,这...

    delphi递归函数应用

    本篇文章将详细探讨Delphi中的递归函数及其应用。 首先,我们要理解递归的基本概念。递归是指一个函数或过程通过调用自身来完成任务。这种调用通常伴随着一个或多个基线条件(base case)和一个或多个递归情况...

    C#递归算法经典示例

    基本情况是问题的最简单形式,可以直接求解,而递归情况则会继续调用自身以解决更复杂的情况。 在描述的示例中,我们处理的是TreeView控件,它通常用于展示层级关系的数据,如文件系统目录结构。每个TreeNode代表一...

    递归算法实例

    递归的核心在于将复杂的问题分解为多个相同或相似的子问题,直到子问题变得足够简单,可以直接求解。在此,我们将深入探讨递归算法在八皇后、折半查找和快速排序中的应用。 1. 八皇后问题:这是一个经典的计算机...

    简单的递归

    递归的基本原理是,一个函数在执行时会调用自身,每次调用都会创建一个新的函数实例,这些实例会形成一个调用栈。递归通常包含两个关键部分:基本情况(base case)和递归情况(recursive case)。基本情况是问题...

    Javascript迭代、递推、穷举、递归常用算法实例讲解

    ### Javascript迭代、递推、穷举、递归常用算法实例讲解 Javascript是一门灵活而强大的编程语言,它在算法实现上有多种方式,其中迭代、递推、穷举和递归是实现算法逻辑时常用的方法。下面,我将对这些方法进行详细...

    XPath递归下降分析 简单Servlet界面

    综上所述,"XPath递归下降分析 简单Servlet界面"这个主题涵盖了XML处理中的XPath技术,以及如何在Java Web开发中使用Servlet来构建用户界面并处理HTTP请求。通过XPath递归下降,我们可以有效地解析复杂的XML结构,而...

    递归算法专题ppt

    本章节通过具体的实例进一步阐述递归算法的应用。 **经典案例:斐波那契数列** 斐波那契数列是一个典型的递归问题,定义如下: - F(0) = 0 - F(1) = 1 - F(n) = F(n-1) + F(n-2),对于 n &gt; 1 **问题背景:** - ...

    递归的基本思想

    阶乘是一个典型的递归应用案例。阶乘函数\( n! \)表示所有小于等于\( n \)的正整数的乘积。例如,\( 5! = 5 \times 4 \times 3 \times 2 \times 1 = 120 \)。 ##### 阶乘的递归实现 ```c int Factorial(int n) { ...

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

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

    一个简单的C#WindowsForm程序,用递归求N!

    总之,这个简单的C# Windows Form程序通过递归实现了阶乘的计算,它不仅展示了C#编程的基本语法,还体现了递归算法的应用。对于初学者来说,这是一个很好的学习递归和Windows Forms交互的实例。通过深入理解并实践...

    treeview的简单实例

    在这个“treeview的简单实例”中,我们将深入探讨如何利用C#来创建和操作`TreeView`控件,包括添加根节点、子节点以及兄弟节点,以及实现节点的展开和折叠功能。 首先,我们要了解`TreeView`控件的基本用法。在...

    递归下降分析法的简单编译器

    这种方法特别适合于上下文无关文法(Context-Free Grammar, CFG),在该文法中,每个非终结符都有一个对应的函数,这个函数通过递归调用来解析非终结符的实例。 **编译器的基础知识** 编译器是计算机科学中的一个...

    用递归函数编写的简易计算器

    总的来说,这个"用递归函数编写的简易计算器"实例展示了如何利用C++的递归特性来解决实际问题。递归提供了一种优雅的解决方案,尽管在理解和调试时可能会比迭代方法更具挑战性,但在正确使用的情况下,它可以大大...

    程序设计中递归算法

    #### 四、递归算法的应用实例 1. **阶乘的递归求解**:阶乘是一个经典的递归问题示例。例如,求解\( n! \)可以通过递归公式\( n! = n \times (n-1)! \)来实现。其中\( (n-1)! \)是比\( n! \)规模更小的子问题。 ``...

Global site tag (gtag.js) - Google Analytics