递归获取部门数方法

前言

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

注意事项‌

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

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

相关推荐
Assby2 分钟前
如何尽可能精确计算线程池执行 shutdown() 后的耗时?
java·后端
焰火199926 分钟前
[Java]自定义重试工具类
java
SuperherRo1 小时前
JAVA攻防-Shiro专题&断点调试&有key利用链&URL&CC&CB&原生反序列化&加密逻辑
java·shiro·反序列化·有key·利用链·原生反序列化·加密逻辑
桦说编程2 小时前
简单方法实现子任务耗时统计
java·后端·监控
爱笑的眼睛112 小时前
超越可视化:降维算法组件的深度解析与工程实践
java·人工智能·python·ai
盖世英雄酱581362 小时前
物品超领取损失1万事故复盘(一)
java·后端
CryptoRzz2 小时前
印度尼西亚(IDX)股票数据对接开发
java·后端·websocket·web3·区块链
你怎么知道我是队长3 小时前
C语言---文件读写
java·c语言·开发语言
wszy18093 小时前
外部链接跳转:从 App 打开浏览器的正确姿势
java·javascript·react native·react.js·harmonyos