递归

介绍

递归,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,发生重复,单项依赖关系箭头成环

 

 

 

posted on 2023-04-19 15:09  or追梦者  阅读(8)  评论(0编辑  收藏  举报