递归获取部门数方法

前言

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

注意事项‌

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

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

相关推荐
float_六七2 小时前
IntelliJ IDEA双击Ctrl的妙用
java·ide·intellij-idea
能摆一天是一天3 小时前
JAVA stream().flatMap()
java·windows
颜如玉4 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员的世界你不懂5 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年5 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
gb42152876 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
曾经的三心草6 小时前
Python2-工具安装使用-anaconda-jupyter-PyCharm-Matplotlib
android·java·服务器
Metaphor6926 小时前
Java 高效处理 Word 文档:查找并替换文本的全面指南
java·经验分享·word
ChinaRainbowSea7 小时前
7. LangChain4j + 记忆缓存详细说明
java·数据库·redis·后端·缓存·langchain·ai编程
stormsha7 小时前
飞算JavaAI炫技赛电商系统商品管理模块的架构设计与实现
java·架构·鸿蒙系统