zoukankan      html  css  js  c++  java
  • 递归算法

    递归函数:通俗的讲,递归算法就是在方法里调用自己。

    递归方法需要注意:

    递归方法一定要有一个满足条件结束本身调用自己。就是要有一个出口结束方法调用。

    递归方法在性能上会有一些损耗,但是在代码方面,可以节省大量的计算和判断。

    递归函数的缺点:性能消耗比较大,会重复计算,调用次数太多可以会超出栈的容量。

    在我遇到的问题中,最经典的就是区域查询:

    在计算区域找相应的上下级数据(假设区域有5级),普通的算法:

    需要先判断层级,然后按级查询

    if (item.AreaLevel == 1)
    {
       var oneInfo = AreaInfo.Where(obj => obj.Level == "1" && obj.Code == item.AreaCode).FirstOrDefault();
       if (oneInfo != null)
       {                    
            list.Add(oneInfo);
            var twoInfo = AreaInfo.Where(obj => obj.ParentCode == oneInfo.Code).ToList();
            var threeInfo = AreaInfo.Where(obj => twoInfo.Select(a => a.Code).Contains(obj.ParentCode)).ToList();
            var foreInfo = AreaInfo.Where(obj => threeInfo.Select(a => a.Code).Contains(obj.ParentCode)).ToList();
            var fiveInfo = AreaInfo.Where(obj => foreInfo.Select(a => a.Code).Contains(obj.ParentCode)).ToList();
            list.AddRange(twoInfo);
            list.AddRange(threeInfo);
            list.AddRange(foreInfo);
            list.AddRange(fiveInfo);
       }
    }else if(item.AreaLevel==2){}else if(item.AreaLevel==3)
    。。。。。一直判断到AreaLevel==5

    递归算法

    private List<GetAreaInfoDTO> GetAreaInfoDto(List<GetAreaInfoDTO> AreaInfo, List<GetAreaInfoDTO> dto)
            {
    
                var result = new List<GetAreaInfoDTO>();
                var infoList = new List<GetAreaInfoDTO>();
                foreach (var item in dto)
                {
    
                    var info = AreaInfo.Where(obj => obj.Level == (Convert.ToInt32(item.Level) + 1).ToString()
                        && obj.ParentCode == item.Code).ToList();
    
                    infoList.AddRange(info);
                }
                if (infoList != null && infoList.Count > 0)//当查到第五级时,infoList为空结束递归,返回多次递归参数,添加到result中
                {
                    result.AddRange(infoList);
                    result.AddRange(GetAreaInfoDto(AreaInfo, infoList));//每次将新得到的参数传入方法中,获取下一级的数据
                }
                return result;
            }
  • 相关阅读:
    css三角形拼接多边形
    弹框提示Request failed with status code 401
    el-upload组件上传闪动
    vue-element-admin校验不通过 页面跳到滚动位置
    请求方式错误
    IE兼容11支持10不支持
    二次封装elementui弹框
    element多张上传的去除动画
    奇怪的知识增加了,python切片特点以及下标的活用,可变tuple
    LeafHttp,同步、异步请求的Http库
  • 原文地址:https://www.cnblogs.com/zwyAndDong/p/13180663.html
Copyright © 2011-2022 走看看