递归获取部门数方法

前言

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

注意事项‌

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

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

相关推荐
KIKIiiiiiiii21 小时前
微信个人号开发中如何高效实现API二次开发
java·前端·python·微信
胡八一21 小时前
30 分钟上手 exp4j:在 Java 中安全、灵活地计算数学表达式
java·开发语言·安全
张较瘦_1 天前
环境搭建 | [入门级]VSCode(Cursor|Trae|Qoder)搭建Java(Springboot3)企业开发环境全流程
java·ide·vscode
007php0071 天前
百度面试题解析:synchronized、volatile、JMM内存模型、JVM运行时区域及堆和方法区(三)
java·开发语言·jvm·缓存·面试·golang·php
YSRM1 天前
Leetcode+Java+图论II
java·leetcode·图论
十铭忘1 天前
基于SAM2的眼动数据跟踪2
java·服务器·前端
okjohn1 天前
浅谈需求分析与管理
java·架构·系统架构·软件工程·产品经理·需求分析·规格说明书
用户0332126663671 天前
Java添加、设置和删除PDF图层:
java
荣光波比1 天前
K8S(十)—— Kubernetes核心组件详解:Pod控制器与配置资源管理
java·容器·kubernetes
m0_651593911 天前
企业级订单系统架构设计:领域驱动 vs 数据驱动实践指南
java·系统架构·领域驱动ddd