递归例子(Java)

目标:把一个关系型数据库中<子,父>关系的并列型列表转换成为一个层级架构树。

DB:

parent node
------ -------
soft_1  staff_B 
soft_1 staff_C 
dev soft_1
dev soft_2
dev staff_A 
gm_A dev 
gm_A hr 
gm_A market 
hr staff_E 
soft_2  staff_D 
boss  gm_A 
NULL boss 

最终架构树:

bossgm_Adevsoft_1staff_B
    staff_C
   soft_2staff_D
   staff_A 
  market  
  hrstaff_E 

这种情况需要用到递归。


主程序:

FileOrganizationNode treeNode = new FileOrganizationNode();
List<FileOrganization> fileOrganizations = new ArrayList<FileOrganization>();
fileOrganizations = fileOrganizationService.findNodeByOrganizationName(organizationName, limit);
treeNode.setName(rootNode.getNodeName());
addTreeNode(treeNode, rootNode.getNodeName(), fileOrganizations);	// 递归插入子node
* fileOrganizations 就是上面的<子,父>列表,rootNode.getNodeName() 取值为"boss"。

FileOrganization(包含其它内容) / FileOrganizationNode(只有子、父名)

/**
 * 
 * file_organization
 * 
 * 组织上下级关系描述
 * 
 */
public class FileOrganization {
	private String nodeName;
	private String nodeParentName;
	...


public class FileOrganizationNode {
	private String name;
	private List<FileOrganizationNode> children;

addTreeNode方法:

	// 递归插入子node
	public void addTreeNode(FileOrganizationNode treeNode, String parentNode, List<FileOrganization> fileOrganizations) {
		final Integer DEF_VALUE = 20;
		List<FileOrganizationNode> childTreeNodes = new ArrayList<FileOrganizationNode>();
		
		for (FileOrganization fileOrganization:fileOrganizations) {
			if (parentNode.equals(fileOrganization.getNodeParentName())) {
				FileOrganizationNode childTreeNode = new FileOrganizationNode();
				childTreeNode.setName(fileOrganization.getNodeName());
				childTreeNode.setValue(DEF_VALUE);
				childTreeNode.setNodeType(fileOrganization.getNodeType());
				childTreeNodes.add(childTreeNode);
				
				// 通过传参childTreeNode串联递归
				addTreeNode(childTreeNode, fileOrganization.getNodeName(), fileOrganizations);
			}
		}
		if (!childTreeNodes.isEmpty()) {
			treeNode.setChildren(childTreeNodes);
		}
	}


treeNode内容:

   




参考:

递归例子(Javascript)http://blog.youkuaiyun.com/textboy/article/details/46544379



Java 中,递归是一种常见的编程技术,指的是一个方法直接或间接调用自身。递归适用于可以分解为多个子问题的场景,每个子问题的解决方式与原问题相同或相似。以下是几个简单的递归方法示例。 ### 阶乘计算 阶乘是递归的经典示例之一。阶乘的定义是 `n! = n * (n-1)!`,其中 `1! = 1` 是基线条件。 ```java public static int factorial(int n) { if (n == 1) { return 1; // 基线条件 } else { return n * factorial(n - 1); // 递归调用 } } ``` ### 累加求和 递归也可以用于求解 `1 + 2 + 3 + ... + n` 的和。该问题可以分解为 `n + sum(n-1)`,其中 `sum(1)` 的值为 `1`。 ```java public static int sum(int n) { if (n == 1) { return 1; // 基线条件 } else { return n + sum(n - 1); // 递归调用 } } ``` ### 字符串反向输出 递归可以用于反向输出字符串的每个字符。通过递归进入字符串的末尾,再逐层返回并输出字符。 ```java public static void reverse(int n, String str) { if (n == str.length()) { return; // 基线条件 } reverse(n + 1, str); // 递归调用 System.out.print(str.charAt(n)); // 逐层输出字符 } ``` ### 递归的实现原理 递归的执行过程涉及**进栈**和**出栈**操作。每次递归调用,程序会将当前状态压入调用栈中,直到满足基线条件后,再逐层返回并执行栈顶的操作。递归的深度受限于 JVM 的栈空间,因此递归深度过大会导致栈溢出(`StackOverflowError`)。 ### 相关问题 递归编程需要注意以下几点: 1. **基线条件**:递归必须包含一个或多个基线条件,以防止无限递归。 2. **递归深度**:递归调用的次数不能过多,否则会导致栈溢出。 3. **性能优化**:某些递归问题可以通过**尾递归优化**或**迭代**方式提升性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值