嵌套List<object>的深度加权求和实现问题
问题分析与解决方案
首先明确一点:排序完全帮不上你的忙,甚至会帮倒忙。这个计算的核心依赖元素的嵌套深度,排序会彻底打乱原有的层级结构,破坏每个元素的深度信息,导致计算结果完全错误。
你的当前代码存在几个关键问题:
- 没有处理嵌套集合的递归遍历:你只判断了元素是否是集合,但没有深入遍历子集合里的元素,完全忽略了深层嵌套的内容。
- 深度计数器逻辑错误:
depthCounter只增加不减少,遇到嵌套集合结束后无法回退到上一层的深度,导致后续元素的深度计算完全混乱。 - 临时总和的处理逻辑错误:你错误地把外层的临时和乘以深度加到总总和,而没有去计算子集合内部元素的实际贡献。
正确的实现方式:递归遍历
嵌套集合的处理天然适合用递归,我们可以设计一个辅助方法,传入当前集合和当前的深度乘数(每嵌套一层,乘数加1),核心逻辑是:
- 遍历集合中的每个元素:如果是整数,直接累加到当前总和;如果是子集合,递归计算子集合的总和,再累加到当前总和。
- 最后将当前总和乘以当前乘数,得到当前层级的贡献值,返回给上层。
以下是修正后的完整代码:
public class Program { public static List<object> TestCase1() { List<object> test = new List<object>(){ 5, 2, new List<object>(){ 7, -1 }, 3, new List<object>(){ 6, new List<object>(){ -13, 8 }, 4, }, }; return test; } // 对外暴露的主方法,初始乘数为1 public static int ProductSum(List<object> array) { return ProductSumHelper(array, 1); } // 递归辅助方法,处理具体的嵌套遍历和计算 private static int ProductSumHelper(List<object> array, int multiplier) { int currentTotal = 0; foreach (var element in array) { if (element is List<object> subCollection) { // 递归处理子集合,乘数+1 currentTotal += ProductSumHelper(subCollection, multiplier + 1); } else { // 处理整数元素,直接累加 currentTotal += (int)element; } } // 当前层级的总和乘以乘数,返回给上层 return currentTotal * multiplier; } static void Main(string[] args) { Console.WriteLine("Result = " + ProductSum(TestCase1())); } }
代码运行过程(对应你的示例)
- 初始调用
ProductSumHelper(外层集合, 1),遍历每个元素:- 5、2、3都是整数,直接加到
currentTotal - 遇到第一个子集合
[7,-1],调用ProductSumHelper([7,-1], 2):遍历7和-1得到总和6,乘以2后返回12,加到外层currentTotal - 遇到第二个子集合
[6, [-13,8],4],调用ProductSumHelper([6,...],2):- 6和4直接加到子层级的
currentTotal - 遇到子子集合
[-13,8],调用ProductSumHelper([-13,8],3):得到总和-5,乘以3后返回-15,加到子层级currentTotal - 子层级
currentTotal为6 + (-15) +4 = -5,乘以2后返回-10,加到外层currentTotal
- 6和4直接加到子层级的
- 5、2、3都是整数,直接加到
- 外层
currentTotal最终为5+2+12+3+(-10)=12,乘以初始乘数1后返回,结果完全符合预期。
内容的提问来源于stack exchange,提问作者raicha
相关产品推荐
相关产品推荐

