递归
介绍
递归,A方法里面调用A方法,给出一个出口以保证不死循环
eg
依赖成环问题,递归暴力解决
需求:要查询设置项的所有下级依赖项 包括间接的
模拟关系表:
underDependencyCodes是成员变量 /** * 如果underDependencyCodes里面没有首项,该方法碰到首尾成环会多递归查数据库一次 * @param code 要查依赖项的设置项id */ public void getUnderDependency(String code){ List<String> dependedCodeByItemCodes = dependencyMapper.findDependedCodeByItemCode(code); if(CollectionUtils.isEmpty(dependedCodeByItemCodes)){ return; }else{ for (String dependency:dependedCodeByItemCodes) { //重复的不递归->碰到成环的直接过了,无视成环 且减少了深度的影响 if(!underDependencyCodes.contains(dependency)){ underDependencyCodes.add(dependency); getUnderDependency(dependency); } } } }
测试
@Test public void test(){ String param = "g"; //把首项添加进去,完全无视成环,一次递归都不多 依赖项集合会包含自身code underDependencyCodes.add(param); getUnderDependency(param); //自身及所有下级依赖code,包括间接依赖 System.out.println(underDependencyCodes); }
衍生问题:判断依赖成环 判断A添加依赖B是否会造成依赖成环
解决思路:
拿到B下面所有依赖,包括间接依赖List
判断List里面是否包含A,是就表示会造成成环 (关键点:依赖成环是因为B下面有A,发生重复,单项依赖关系箭头成环)
作者: deity-night
出处: https://www.cnblogs.com/deity-night/
关于作者:码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(***@163.com)咨询.