C# 递归,死者计数不工作
C# Recursion, Decedents Count Not working
我为我的问题制作了一个较小的样本,我正在尝试获取每个节点的死者,但是它计算的死者计数为 0(node0, 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;
}
我为我的问题制作了一个较小的样本,我正在尝试获取每个节点的死者,但是它计算的死者计数为 0(node0, 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;
}