递归函数:通俗的讲,递归算法就是在方法里调用自己。
递归方法需要注意:
递归方法一定要有一个满足条件结束本身调用自己。就是要有一个出口结束方法调用。
递归方法在性能上会有一些损耗,但是在代码方面,可以节省大量的计算和判断。
递归函数的缺点:性能消耗比较大,会重复计算,调用次数太多可以会超出栈的容量。
在我遇到的问题中,最经典的就是区域查询:
在计算区域找相应的上下级数据(假设区域有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; }