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

C# 递归查找C中的最低级别项#,c#,recursion,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(

我在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;
        }
    }

您只希望在处于最低级别时返回foo。不管怎样,你都要把它还给我。如果不是最低级别,则应返回递归调用返回的值

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

您需要将调用GetLowestLevel foo的结果分配给foo

foo = GetLowestLevelFoo(foo.ChildFoo)
否则,您将返回开始时使用的内容。

编辑:

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

正如其他人现在所评论的,您的代码在堆栈中递归,返回每个“foo”级别:最后返回最顶层的“节点”

试试这个:

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

    return GetLowestLevelFoo(foo.ChildFoo);
}

你也需要在IF中返回一些东西。我的错。在疯狂的冲刺中快速键入以提供答案。我理解。在这里回答问题是无情的。你不需要else。事实上,为了消除缩进级别,我建议不要使用else。如果IF语句不满意,它将跳过它,然后继续执行t返回语句-就像掉进else块一样。@David B你完全正确。我将编辑我的回复。我实际上是单步通过OP的代码,看着它以四种风格返回'foo',因为它“爬”回堆栈,然后发布我的回复,所以我感到“双重羞愧:)谢谢!