【递归】java递归算法及替代方法

article/2025/10/29 12:39:34

文章目录

  • 菜单树递归(树根往子节点递归)
      • 需求: 取所有level小于2的节点 ( 返回结果为普通list格式)
  • 为list格式的数据设置children(非递归)
      • 需求: 数据库查出来的原始list 如果有children就设置
  • 使用循环代替向下递归
      • 需求:使用循环的方式 代替菜单树的递归

递归会造成压栈 栈帧变多 容易Stack Overflow,所以递归一般用于有限且数量可控范围内

个人是很讨厌递归的,一般要用到递归的实际场景,代码就是又臭又长了,但这也是最简单粗暴的算法了,所以记录个工作中遇到的递归案例,平常也需要加强练习,遇到才不会不知所措。

菜单树递归(树根往子节点递归)

需求: 取所有level小于2的节点 ( 返回结果为普通list格式)

Tree结构

private Long id;private Long fid;private Integer level;private List<Tree> children;

allTreeList数据:
在这里插入图片描述

代码实现:

// SysMenuDTO 继承TreeList<SysMenuDTO> res= new ArrayList<>();res= handleChild(allTreeList, res);

handleChild 方法:

    private List<SysMenuDTO> handleChild(List<SysMenuDTO> treeList, List<SysMenuDTO> resList) {for (SysMenuDTO each : treeList) {if (each.getLevel() < 2) {resList.add(each);}if (null != each.getChildren()) {List<Tree> children = each.getChildren();// 转型List<SysMenuDTO> treeChild = new ArrayList<>();for (Tree child : children) {treeChild.add((SysMenuDTO) child);}handleChild(treeChild, resList);}}return resList;}

为list格式的数据设置children(非递归)

需求: 数据库查出来的原始list 如果有children就设置

Tree结构同上

list数据: 可以看到此时的数据是平铺的 children为null
在这里插入图片描述
代码实现:

// allTreeList 结构同上
List<SysMenuDTO> allTreeList = Tree.assembleTree(allList);
    public static <T extends Tree> List<T> assembleTree (List<T> vos) {/*如果节点数为0或1,则不需要组装*/if ( vos == null ) {return vos;}List<T> retList = new ArrayList<>();Map<Long, T> map = new HashMap<>();for (T item : vos) {int level = getLevel(item.getCode());item.setLevel(level);map.put(item.getId(), item);if (item.getFid() == null || item.getFid() == 0 ) {retList.add(item);continue;}T fNode = map.get(item.getFid());if (null != fNode) {List<Tree> subs = fNode.getChildren();if (null == subs) {subs = new ArrayList<>();fNode.setChildren(subs);}subs.add(item);} else {log.error("Failed to get father node: {}", item);}}return retList;}

使用循环代替向下递归

需求:使用循环的方式 代替菜单树的递归

这个时候我们要借助第三方容器,通常使用栈或队列。

代码实现:

           // 所有菜单树List<SysMenuDTO> allTreeList = xxx;// 一二级菜单树 level从0开始List<SysMenuDTO> res = new ArrayList<>();Queue<SysMenuDTO> queue = new LinkedBlockingDeque() ;for (SysMenuDTO each : allTreeList) {// 将每个节点放入队列中queue.offer(each);}while (!queue.isEmpty()) {// 出队列SysMenuDTO each = queue.poll();if (Optional.ofNullable(each.getLevel()).orElse(0) < 2) {res.add(each);}if (null != each.getChildren()) {List<Tree> children = each.getChildren();for (Tree eachElement : children) {// 子节点不为空 将子节点的每个对象入队列queue.offer((SysMenuDTO) eachElement);}}}

http://chatgpt.dhexx.cn/article/gEVobH3y.shtml

相关文章

Java递归

1.递归的概念&#xff1a; 一个方法在执行过程中调用自身, 就称为 "递归". 示例&#xff1a; //递归求n的阶乘 public static void main(String[] args) {int n 5;int ret factor(n);System.out.println("ret " ret); }public static int factor(int…

java递归算法(一)——详解以及几个经典示例

什么是递归 递归就是一个程序或函数在其中定义或说明有之间或者间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个原问题相似的规模较小的问题来求解&#xff0c;递归策略只需要少量的程序就可以描述出解题过程所需要的多次重复计算&#xff0c;大…

Java 递归算法

一、概述&#xff1a; Java递归&#xff1a;简单说就是函数自身直接或间接调用函数的本身。 二、应用场景&#xff1a; 若&#xff1a;一个功能在被重复使用&#xff0c;并每次使用时&#xff0c;参与运算的结果和上一次调用有关&#xff0c;这时就可以使用递归来解决这个问题…

递归与递归算法实例(java实现)

一、递归介绍 递归算法&#xff08;英语&#xff1a;recursion algorithm&#xff09;在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。绝大 多数编程语言支持函数的自调用&#xff0c;在这些语言中函数可以通过调用自身来进行递归。 定义&#xff1…

Java的递归算法

递归算法设计的基本思想是&#xff1a;对于一个复杂的问题&#xff0c;把原问题分解为若干个相对简单类同的子问题&#xff0c;继续下去直到子问题简单到能够直接求解&#xff0c;也就是说到了递推的出口&#xff0c;这样原问题就有递推得解。 关键要抓住的是&#xff1a; &…

java递归算法实现

Coding多了&#xff0c;递归算法是非常常见的&#xff0c;最近我一直在做树形结构的封装&#xff0c;所以更加的离不开递归算法。所以今天就简单说一下这个递归算法&#xff0c;用java实现一个非常经典的递归实例。 递归算法&#xff0c;其实说白了&#xff0c;就是程序的自身调…

【Java】递归算法

文章目录 什么是递归&#xff1f;递归求阶乘递归求解斐波那契数列猴子吃桃问题 什么是递归&#xff1f; 程序 调用自身 的编程技巧成为 递归&#xff08;recursion&#xff09;。 递归算法是一种直接或间接调用、定义自身的函数或方法的算法&#xff0c;也就是调用自身。 递归…

Java递归算法

递归在程序语言中就是方法本身自己调用自己&#xff0c;而递归思想是算法的重要思想之一&#xff0c;就是利用递归来实现解决问题的算法。 递归也分为直接递归和间接递归。 那么什么叫直接递归什么又叫间接递归呢&#xff1f; //直接递归调用 function(){...function();... …

散布矩阵(scatter_matrix)及相关系数(correlation coefficients)实例分析

在进行机器学习建模之前&#xff0c;需要对数据进行分析&#xff0c;判断各特征(属性&#xff0c;维度)的数据分布及其之间的关系成为十分必要的环节&#xff0c;本文利用Pandas和Numpy的散布矩阵函数及相关系数函数对数据集特征及其关系进行实例分析。 散布矩阵(scatter_matri…

Probability And Statistics——CorrelationsCovariance

Skew&#xff08;偏度&#xff09; 在概率论和统计学中&#xff0c;偏度衡量实数随机变量概率分布的不对称性。偏度的值可以为正&#xff0c;可以为负或者甚至是无法定义。在数量上&#xff0c;偏度为负&#xff08;负偏态&#xff09;就意味着在概率密度函数左侧的尾部比右侧的…

structural covariance network

structural covariance network 结构协方差网络 结构协方差网络是一个较老的概念&#xff0c;只是近年受到了一定的重视。 大佬 Aaron Alexander-Bloch 在2013年通过一篇综述描述了这种结构协方差网络的应用意义及前景。 既往一般是在bold信号和fiber tracking建立连接&#xf…

_variant_t、CComVariant与COleVariant、CDBVariant

目前计算机语言多种多样&#xff0c;如C、Java、Basic、Pascal等&#xff0c;此外还有JavaScript、VBScript、ActionScript等脚本语言&#xff0c;它们各自维护自己的数据类型&#xff0c;当使用C这样强类型的语言来读取数据库或者与其他语言之间来交换数据时&#xff0c;它很有…

Partial correlation coefficient

利用PYTHON计算偏相关系数&#xff08;Partial correlation coefficient) 在统计学中&#xff0c;我们经常使用皮尔逊相关系数来衡量两个变量之间的线性关系。然而&#xff0c;有时我们感兴趣的是理解两个变量之间的关系&#xff0c;同时控制第三个变量。 例如&#xff0c;假设…

Multilevel Cooperative Coevolution for Large Scale Optimization

0、论文背景 本文在CCEA_G的基础上&#xff0c;提出了MLCC框架。在MLCC中&#xff0c;基于不同组大小的随机分组策略构造了一组问题分解器。演化过程分为若干个循环&#xff0c;在每个周期开始时&#xff0c;MLCC使用自适应机制根据其历史性能选择分解器。由于不同的组大小捕获…

mean value coordinates(均值重心坐标)定义及证明

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 在图形学中对于物体的描述往往是离散&#xff0c;但是在具体展示过程中我们又希望是连续。线性插值是解决离散与连续的常用手段。 三角形中的插值点击前往凸四边形中的…

numpy中的convolve的理解

写在前面 浏览更多内容&#xff0c;可访问&#xff1a;http://www.growai.cn 欢迎您关注作者知乎&#xff1a;ML与DL成长之路 推荐关注公众号&#xff1a;AI成长社&#xff0c;ML与DL的成长圣地。 函数 numpy.convolve(a, v, mode‘full’)&#xff0c;这是numpy函数中的卷…

Clustering Coefficient

Define Clustering Coefficient&#xff1a;聚类系数 Clustering Coefficient measures the degree to which nodes in a network tend to cluster or form triangles. ——聚类系数衡量网络中节点倾向于聚类或形成三角形的程度 Triadic Closure 三元闭包 The tendency of…

covariate(covariate是控制变量吗)

如何用STATA对连续性变量进行meta回归分析 在stata中有个metareg命令&#xff0c;好像可以对连续变量进行回归分析。 附件中是一篇pdf文档&#xff0c;主要介绍stata中关于meta分析的命令。跟大家分享一下。 里面在提到metareg命令时&#xff0c;列举了以下三个列子&#xff1a…

协方差矩阵简介(Covariance Matrix)

协方差矩阵定义 首先我们要明白&#xff0c;协方差实际是在概率论和统计学中用于衡量两个变量的总体误差,当然方差是协方差的一种特殊情况&#xff0c;即当两个变量是相同情况。它表示的是两个变量的总体的误差&#xff0c;这与只表示一个变量误差的方差不同。如果两个变量的变…

covariance matrix

协方差的定义 对于一般的分布&#xff0c;直接代入E(X)之类的就可以计算出来了&#xff0c;但真给你一个具体数值的分布&#xff0c;要计算协方差矩阵&#xff0c;根据这个公式来计算&#xff0c;还真不容易反应过来。这里用一个例子说明协方差矩阵是怎么计算出来的吧。 记住&…