在项目中有个需求:查找指定机构下所有的子机构,之前使用的递归方式,效率相差很多
比如之前写的一个递归的方法:https://blog.csdn.net/qq_33651286/article/details/140539728
在Java中,递归和迭代是两种常用的算法实现方式。递归通过函数自身调用来解决问题,而迭代则通过循环结构(如for或while循环)来重复执行直到满足特定条件。下面将分别通过示例来说明如何在Java中实现递归和迭代。
递归与迭代的选择
- 递归:代码更简洁,易于理解(特别是对于某些问题,如树的遍历),但可能会消耗更多的内存(因为每次函数调用都会在调用栈上保存一些信息),并且如果递归深度太大,可能会导致栈溢出错误。
- 迭代:通常比递归更有效率(特别是对于大量数据的处理),因为它不需要额外的函数调用开销,也不会引起栈溢出问题(在合理的循环控制下)。但迭代可能需要更复杂的逻辑来管理循环条件。
在选择使用递归还是迭代时,需要根据具体问题的性质、数据量的大小、以及个人偏好来决定。在某些情况下,也可以将递归算法转换为迭代算法,以提高效率。
public List<Integer> getAllIdByOrganId(Integer rootOrganId, List<Organ> organs) {List<Integer> ids = new ArrayList<>();if (organs == null || organs.isEmpty() || rootOrganId == null) return ids;// 构建从父机构ID到子机构ID列表的映射Map<Integer, List<Integer>> parentToChildrenMap = new HashMap<>();for (Organ organ : organs) {if (organ.getOrganId() != null) {parentToChildrenMap.computeIfAbsent(organ.getOrganId(), k -> new ArrayList<>()).add(organ.getId());}}// 检查根机构是否有子机构if (!parentToChildrenMap.containsKey(rootOrganId)) return ids;// 使用队列进行BFS遍历Queue<Integer> queue = new LinkedList<>(parentToChildrenMap.get(rootOrganId));while (!queue.isEmpty()) {Integer currentId = queue.poll();// 将当前机构的ID添加到结果中ids.add(currentId);// 查找当前机构的所有直接子机构,并将它们加入队列if (parentToChildrenMap.containsKey(currentId)) {queue.addAll(parentToChildrenMap.get(currentId));}}return ids;}