集合中的递归函数

时间:2012-09-27 11:24:41

标签: c# function recursion

我正在使用c#和List集合并加载了值。一旦完成,我试图递归地阅读它们,但有些我无法实现这一点。

以下是我的主要代码。

    private static void Main(string[] args)
            {
                var node = new Node
                    {
                        Name = "N1",
                        Nodes =
                            new List<Node>
                                {
                                    new Node { Name = "N1a" },
                                    new Node { Name = "N1b", Nodes = new List<Node> { new Node { Name = "N1B1" } } },
                                    new Node
                                        {
                                            Name = "N1c",
                                            Nodes =
                                                new List<Node> { new Node { Name = "N1C1", Nodes = new List<Node> {new Node{Name = "N1C1A"} } } }
                                        }
                                }
                    };
                GetNodes( node );
                Console.ReadLine();
            }

 public class Node
        {
            public string Name { get; set; }

            public IList<Node> Nodes { get; set; }
        }

并且函数调用正在跟随

public static IEnumerable<Node> GetNodes(Node node)
        {
            if (node == null)
            {
                return null;
            }

            Console.WriteLine(node.Name);

            foreach (var n in node.Nodes)
            {
                return GetNodes(n);
            }

            return null;
        }
    }  

有人可以帮我修复递归函数吗?

4 个答案:

答案 0 :(得分:6)

如果您只想打印所有节点的名称,

public static void GetNodes(Node node)
{
    if (node == null)
    {
        return;
    }
    Console.WriteLine(node.Name);
    foreach (var n in node.Nodes)
    {
        GetNodes(n);
    }
}

如果你想弄平树,

public static IEnumerable<Node> GetNodes(Node node)
{
    if (node == null)
    {
        yield break;
    }
    yield return node;
    foreach (var n in node.Nodes)
    {
        foreach(var innerN in GetNodes(n))
        {
            yield return innerN;
        }
    }
}

答案 1 :(得分:2)

public static IEnumerable<Node> GetNodes(Node node)
{
    if (node == null) return null;

    var nodes = new List<Node>();
    nodes.Add(node);

    Console.WriteLine(node.Name);

    if (node.Nodes != null)
    {
        foreach (var n in node.Nodes)
        {
            nodes.AddRange(GetNodes(n));
        }
    }

    return nodes;
}}

答案 2 :(得分:1)

你的方法只返回n​​ull,或者调用自身,然后返回null,或者自己调用.....所以在一天结束时它返回null或不终止。如果要对值进行分类,可以在将代码写入控制台时将它们写入代码中相同位置的列表中。

public static void GetNodes(Node node, List<Node> output)
{
    if (node == null)
        return;

    output.Add(node);
    Console.WriteLine(node.Name);

    foreach (var n in node.Nodes)
    {
        GetNodes(n, output);
    }
}

答案 3 :(得分:0)

在第一次迭代中,您将立即从循环内的方法返回。没有执行其他迭代。