递归查找C#中的最低级别项

时间:2010-03-03 17:57:30

标签: c# recursion

GetLowestLevelFoo中缺少什么?为什么我得到答案A而不是D?

    public class Foo
    {
        public string Name { get; set; }
        public Foo ChildFoo { get; set; }
    }

    [TestFixture]
    public class Recursion
    {
        [Test]
        public void Test()
        {
            Foo foo = new Foo
            {
                Name = "A",
                ChildFoo = new Foo
                {
                    Name = "B",
                    ChildFoo = new Foo
                    {
                        Name = "C",
                        ChildFoo = new Foo
                        {
                            Name = "D"
                        }
                    }
                }
            };

            Assert.AreEqual("D", GetLowestLevelFoo(foo).Name);
        }

        public Foo GetLowestLevelFoo(Foo foo)
        {
            if (foo.ChildFoo != null)
            {
                GetLowestLevelFoo(foo.ChildFoo);
            }
            return foo;
        }
    }

4 个答案:

答案 0 :(得分:11)

你只想在最低级别返回foo。无论怎样,你都会回来。如果您不在最低级别,则应返回递归调用返回的值。

public Foo GetLowestLevelFoo(Foo foo)
    {
        if (foo.ChildFoo != null)
        {
            return GetLowestLevelFoo(foo.ChildFoo);
        }
        else
        {
            return foo;
        }
    }

答案 1 :(得分:2)

编辑:

public Foo GetLowestLevelFoo(Foo foo)
{
    if (foo.ChildFoo != null)
    {
        return GetLowestLevelFoo(foo.ChildFoo);
    }
    return foo;
}

答案 2 :(得分:1)

你需要给foo分配你对GetLowestLevelFoo的调用结果。

foo = GetLowestLevelFoo(foo.ChildFoo)

否则你将返回你的开始。

答案 3 :(得分:0)

正如其他人现在评论的那样,你的代码通过堆栈递回,返回每个“级别”foo“:最后返回最顶层的”节点。“

试试这个:

public Foo GetLowestLevelFoo(Foo foo)
{
    if (foo.ChildFoo == null) return foo;

    return GetLowestLevelFoo(foo.ChildFoo);
}