C# 递归查找C中的最低级别项#
我在GetLowestLevelFoo中遗漏了什么?为什么我得到的答案是A而不是DC# 递归查找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(
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',因为它“爬”回堆栈,然后发布我的回复,所以我感到“双重羞愧:)谢谢!