前言
递归(Recursion)在编程中是一个非常重要的概念。简单来说,递归指的是一个函数在其定义中直接或间接调用自身。这种调用机制允许函数通过分解问题为更小的相似子问题来解决复杂问题。
递归的定义 :
递归是一种在函数定义中调用函数自身的方法。它通常包含一个或多个基准情况(base case),用于结束递归调用链,以及一个或多个递归步骤,用于将问题分解为更小的子问题。
递归的原理:
1.基准情况:这是递归调用的终止条件。当满足基准情况时,函数将不再调用自身,而是返回结果。
2.递归步骤:在递归步骤中,函数会调用自身来解决一个规模更小的相似问题。这个过程会一直持续,直到达到基准情况。
递归的示例:
现在我将获取部门树作为示例
public List<SysDept> getDeptTree() {
try {
// 1.查询所有部门信息
List<SysDept> sysDepts = approveMapper.queryDeptList();
// 2.将所有部门根据父级id分组
Map<Long, List<SysDept>> childrenMap = sysDepts.stream()
.collect(Collectors.groupingBy(SysDept::getParentId));
// 3.组装部门树结构
List<SysDept> result = new ArrayList<>();
for (SysDept sysDept : sysDepts) {
// 4.假设顶级部门的parentId为0
if (sysDept.getParentId() == 0L) {
// 5.将顶级部门的children为其下所有子部门
List<SysDept> children = getChildren(sysDept, childrenMap);
sysDept.setChildren(children);
result.add(sysDept);
}
}
return result;
} catch (Exception e) {
throw new RuntimeException("获取部门树形结构失败!"+e.getMessage());
}
}
/**
* 递归获取子部门
*/
private List<SysDept> getChildren(SysDept root, Map<Long, List<SysDept>> childrenMap) {
List<SysDept> treeList = childrenMap.getOrDefault(root.getDeptId(), new ArrayList<>());
for (SysDept sysDept : treeList) {
// 6.递归获取子部门
sysDept.setChildren(getChildren(sysDept, childrenMap));
}
return treeList;
}
注意事项
总结:递归是一种强大的编程范式,适用于问题可分解为自相似结构的场景,但需谨慎设计终止条件和优化性能。