遍历树的递归计数节点的子节点未按预期工作

Mar*_*ros 2 c# recursion

非常基本的问题,我有一个循环遍历树中节点的所有子节点并对其进行计数的方法.问题是,计数器似乎没有正常工作,可能是由于一些范围问题.

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所拥有的子节点数结束.有一个简单的解决方案,或者我正在接近这个问题的方式有什么问题吗?

Abi*_*n47 6

它无法工作的原因是因为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)