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;
}
}
答案 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);
}