C# 递归,死者计数不工作

C# Recursion, Decedents Count Not working

我为我的问题制作了一个较小的样本,我正在尝试获取每个节点的死者,但是它计算的死者计数为 0(no​​de0, node1) 除了最低级别的节点 (node3)?任何帮助将不胜感激,在此先感谢。

class Program
{
    static void Main(string[] args)
    {
        var node3 = new Node
        {
            Id = 3,
            Children = new List<Node>()
        };
        var n2Children = new List<Node>();
        n2Children.Add(node3);
        var node2 = new Node
        {
            Id = 2,
            Children = n2Children
        };
        var n1Children = new List<Node>();
        n1Children.Add(node2);

        var node1 = new Node
        {
            Id = 0,
            Children = n1Children
        };
        SetDecendents(node1);
        Console.WriteLine(node1.Decendents);
        Console.ReadLine();
    }

    public static int SetDecendents(Node n)
    {
        if (n.Children.Count() == 0)
        {
            n.Decendents = 1;
        }
        else
        {
            n.Children.Sum(c => SetDecendents(c));
        }
        return n.Decendents;
    }
}

public class Node
{
    public int Id { get; set; }
    public int Decendents { get; set; }
    public ICollection<Node> Children { get; set; }
}

除了叶节点之外的所有节点的结果都是 0 的原因是每次调用函数 SetDecendents returns 一个值 (n.Decendents) 但调用者不将该值用于任何用途。它应该用作计算调用者的 n.Decendents.

的一部分

SetDecendents 计算后代数时,需要再做一处修改。除了对节点的子节点求和外,您还需要为节点本身加 1。

public static int SetDecendents(Node n)
{
    if (n.Children.Count() == 0)
    {
        n.Decendents = 1;
    }
    else
    {
        n.Decendents = 1 + n.Children.Sum(c => SetDecendents(c));
    }
    return n.Decendents;
}

这可以简化为:

public static int SetDecendents(Node n)
{
    n.Decendents = 1 + n.Children.Sum(c => SetDecendents(c));
    return n.Decendents;
}

编辑:下面是每个节点计数不包括自身的版本,OP 已澄清这不是他们的用例。

public static int SetDecendents(Node n)
{
    if (n.Children.Count() == 0)
    {
        n.Decendents = 0;
    }
    else
    {
        n.Decendents = n.Children.Count() + n.Children.Sum(c => SetDecendents(c));
    }
    return n.Decendents;
}

您的 SetDecendents 方法有一些不正确的逻辑。应该是:

public static int SetDecendents(Node n)
{
    if (n.Children.Count() == 0)
    {
        n.Decendents = 0;
    }
    else
    {
        n.Decendents = n.Children.Count() + n.Children.Sum(c => SetDecendents(c));
    }

    return n.Decendents;
}

完整的工作示例:https://dotnetfiddle.net/6KPeXF

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main(string[] args)
    {
        var node3 = new Node
        {
            Id = 3,
            Children = new List<Node>()
        };

        var n2Children = new List<Node>();
        n2Children.Add(node3);

        var node2 = new Node
        {
            Id = 2,
            Children = n2Children
        };

        var n1Children = new List<Node>();
        n1Children.Add(node2);

        var node1 = new Node
        {
            Id = 1,
            Children = n1Children
        };

        var n0Children = new List<Node>();
        n0Children.Add(node1);

        var node0 = new Node
        {
            Id = 0,
            Children = n0Children
        };

        SetDecendents(node0);
        Console.WriteLine(node0.Decendents);

        SetDecendents(node1);
        Console.WriteLine(node1.Decendents);

        SetDecendents(node2);
        Console.WriteLine(node2.Decendents);

        SetDecendents(node3);
        Console.WriteLine(node3.Decendents);

        Console.ReadLine();
    }

    public static int SetDecendents(Node n)
    {

        if (n.Children.Count() == 0)
        {
            n.Decendents = 0;
        }
        else
        {
            n.Decendents = n.Children.Count() + n.Children.Sum(c => SetDecendents(c));
        }

        return n.Decendents;
    }
}

public class Node
{
    public int Id { get; set; }
    public int Decendents { get; set; }
    public ICollection<Node> Children { get; set; }
}

编辑:

如果您希望节点本身包含在死者计数中(如您的评论中所述),只需将其更改为:

public static int SetDecendents(Node n)
{
    if (n.Children.Count() == 0)
    {
        n.Decendents = 1;
    }
    else
    {
        n.Decendents = n.Children.Count() + n.Children.Sum(c => SetDecendents(c));
    }

    return n.Decendents;
}