递归获取部门数方法

前言

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

注意事项‌

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

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

相关推荐
倔强的小石头_2 小时前
【C语言指南】函数指针深度解析
java·c语言·算法
kangkang-6 小时前
PC端基于SpringBoot架构控制无人机(三):系统架构设计
java·架构·无人机
界面开发小八哥7 小时前
「Java EE开发指南」如何用MyEclipse创建一个WEB项目?(三)
java·ide·java-ee·myeclipse
idolyXyz8 小时前
[java: Cleaner]-一文述之
java
一碗谦谦粉8 小时前
Maven 依赖调解的两大原则
java·maven
netyeaxi8 小时前
Java:使用spring-boot + mybatis如何打印SQL日志?
java·spring·mybatis
收破烂的小熊猫~9 小时前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
猴哥源码9 小时前
基于Java+SpringBoot的动物领养平台
java·spring boot
老任与码9 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
小兵张健9 小时前
武汉拿下 23k offer 经历
java·面试·ai编程