使用递归聚合总计 - 仅适用于一个父子级别

分享于2022年07月17日 c# recursion sum 问答
【问题标题】:使用递归聚合总计 - 仅适用于一个父子级别(Aggregating totals using recursion - works one parent-child level only)
【发布时间】:2022-01-26 19:24:52
【问题描述】:

我有一个树视图控件,其中包含一个附加到每个节点的对象列表。选择节点时,我想知道所选节点和所有子节点的对象的总数。

递归函数按预期遍历树,但我没有正确聚合总和。它只添加当前节点和下一级子节点的值。

我确定我的代码中的最后一行不正确(返回 n.Maps.Count),但如果层次结构深于一层,我不知道如何聚合这些值。

感谢任何帮助。问候克里斯

private void CallingFunction()
{
    ....  ...

    foreach (GeoSchemeTreeNode n in node.Nodes)
    {
        xx += AddTotal(n);
    }

    Console.WriteLine($"total={xx});
}

private int AddTotal(GeoSchemeTreeNode n)
{
    foreach (GeoSchemeTreeNode i in n.Nodes)
    {
        AddTotal(i);
    }

    return n.Maps.Count;
}

  • 您需要将递归 AddTotal 调用的结果相加,并将该总和添加到 return 语句中。
  • 要保存嵌套值,请在 AddTotal 中创建可选参数,该参数将存储以前的级别值。例如: AddTotal(GeoSchemeTreeNode n, int value = 0) 并在你的 foreach 中解析它并返回 value + n.Maps.Count

【解决方案1】:

您的问题似乎是您实际上并没有存储和汇总递归的乘积。

固定方法应该如下所示:

private int AddTotal(GeoSchemeTreeNode n)
{
    int total = n.Maps.Count;

    foreach (GeoSchemeTreeNode i in n.Nodes)
    {
        total += AddTotal(i);
    }

    return total;
}

  • 非常感谢 Anthony 的快速回复 - 很有魅力!