非常基本的问题,我有一个方法可以遍历树中所有节点的子节点并对它们进行计数。问题是,柜台似乎没有正常工作,可能是由于一些范围问题。遍历树的递归计算节点的子节点不能按预期方式工作
递归的每次迭代之后,计数器复位,并最终它只是重置为int
我开始。我想让柜台简单地以最初节点的孩子数量结束。有没有简单的解决方案,或者我遇到这个问题的方式有什么问题吗?
非常基本的问题,我有一个方法可以遍历树中所有节点的子节点并对它们进行计数。问题是,柜台似乎没有正常工作,可能是由于一些范围问题。遍历树的递归计算节点的子节点不能按预期方式工作
递归的每次迭代之后,计数器复位,并最终它只是重置为int
我开始。我想让柜台简单地以最初节点的孩子数量结束。有没有简单的解决方案,或者我遇到这个问题的方式有什么问题吗?
它不工作的原因是因为counter
参数被按值传递。这意味着当你将它作为参数传递时,这些值被复制到一个全新的变量中。您对该变量所做的任何更改都不会影响您最初传递的变量。
例如,在这个代码:
int i = 5;
AddFiveToInt(i);
Console.WriteLine(i);
// Prints: 5
有两种方法可以解决这个。
public static void CountChildNodes(Node node, ref int counter)
{
foreach (Node child in node.Children)
{
counter++;
CountChildNodes(child, ref counter);
}
}
或者返回的最新值:要么你int
按引用传递
public static int CountChildNodes(Node node)
{
int counter = 0;
foreach (Node child in node.Children)
{
counter++;
counter += CountChildNodes(child);
}
return counter;
}
正是我在寻找和很好的解释,谢谢。 –
这是因为是通过值传递。改为通过ref
。
public static void CountChildNodes(Node node, ref int counter)
试试这个,
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;
}
尝试'裁判INT counter'像[这个递归示例] (http://stackoverflow.com/a/19913489/3504007) –