递归获取部门数方法

前言

递归(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;
    }

注意事项‌

  • ‌效率问题‌:递归可能引发栈溢出或重复计算(如斐波那契数列的朴素递归),需结合尾递归优化动态规划改进。
  • ‌理解难度‌:需通过"递进+回归"过程分析,如阶乘的逐步展开与回溯。

‌总结‌:递归是一种强大的编程范式,适用于问题可分解为自相似结构的场景,但需谨慎设计终止条件和优化性能。

相关推荐
陈大爷(有低保)43 分钟前
swagger3融入springboot
java
weixin_376934633 小时前
JDK Version Manager (JVMS)
java·开发语言
月月大王3 小时前
easyexcel导出动态写入标题和数据
java·服务器·前端
大G哥4 小时前
Kotlin Lambda语法错误修复
android·java·开发语言·kotlin
行走__Wz5 小时前
计算机学习路线与编程语言选择(信息差)
java·开发语言·javascript·学习·编程语言选择·计算机学习路线
Micro麦可乐6 小时前
最新Spring Security实战教程(十四)OAuth2.0精讲 - 四种授权模式与资源服务器搭建
java·服务器·spring boot·spring·spring security·oauth2·oauth2授权
进击的小白菜6 小时前
如何高效实现「LeetCode25. K 个一组翻转链表」?Java 详细解决方案
java·数据结构·leetcode·链表
悟能不能悟6 小时前
java实现一个操作日志模块功能,怎么设计
java·开发语言
caihuayuan57 小时前
[数据库之十四] 数据库索引之位图索引
java·大数据·spring boot·后端·课程设计
blammmp7 小时前
算法专题四:前缀和
java·开发语言·算法