非常基本的问题,我有一个方法循环遍历树中节点的所有子节点并对它们进行计数。问题是,计数器似乎没有正常工作,可能是由于一些范围问题。
public static void CountChildNodes(Node node, int counter)
{
foreach (Node child in node.Children)
{
counter++;
CountChildNodes(child, counter);
}
}
计数器在递归的每次迭代后重置,最后它只重置为我开始的int
。我希望计数器只是以初始节点所拥有的子节点数结束。有没有一个简单的解决方案,或者我处理这个问题的方式有问题吗?
答案 0 :(得分:6)
它不起作用的原因是因为counter
参数是按值传递的。这意味着当您将其作为参数传递时,值将被复制到一个全新的变量中。您对该变量所做的任何更改都不会影响您最初传递的变量。
例如,在此代码中:
int i = 5;
AddFiveToInt(i);
Console.WriteLine(i);
// Prints: 5
有两种方法可以解决这个问题。要么通过引用传递int
:
public static void CountChildNodes(Node node, ref int counter)
{
foreach (Node child in node.Children)
{
counter++;
CountChildNodes(child, ref counter);
}
}
或者返回最新值:
public static int CountChildNodes(Node node)
{
int counter = 0;
foreach (Node child in node.Children)
{
counter++;
counter += CountChildNodes(child);
}
return counter;
}
答案 1 :(得分:2)
那是因为counter
通过值传递。改为通过ref
。
public static void CountChildNodes(Node node, ref int counter)
答案 2 :(得分:0)
试试这个,
public static int CountChildNodes(Node node)
{
int c = 0;
if ((node.Children == null) || (node.Children.Count == 0))
return c;
foreach (Node child in node.Children)
{
c++;
c+=CountChildNodes(child);
}
return c;
}