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