递归算法

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

递归方法需要注意:

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

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

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

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

在计算区域找相应的上下级数据(假设区域有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;
        }
原文地址:https://www.cnblogs.com/zwyAndDong/p/13180663.html