2010-03-03 69 views
2

GetLowestLevelFoo中缺少什么?为什么我会得到答案A而不是D?以递归方式查找C#中的最低级别项目

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

回答

11

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

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

呸我敢肯定,我试过了疯狂的破折号期间谢谢 – 2010-03-03 18:02:31

1

您需要将您的调用结果分配给GetLowestLevelFoo。

foo = GetLowestLevelFoo(foo.ChildFoo) 

否则,你正在返回你开始的东西。

2

编辑:

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

您需要将IF内返回的东西以及 – 2010-03-03 18:02:28

+0

我的坏快速打字增刊!。 Ÿ答案。 – 2010-03-03 18:04:40

+0

我明白了。这是无情的试图回答这里的问题。 – 2010-03-03 18:35:40

0

至于其他现在有评论,您的代码递归从堆栈中,返回每个富“水平‘’:终于返回层次最高的‘节点’

试试这个:。

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

    return GetLowestLevelFoo(foo.ChildFoo); 
} 
+0

@David B你绝对是对的。我会编辑我的回复。我实际上单步穿过OP的代码并观察它返回'foo四种口味,因为它在发布我的回复之前“抓取”了堆栈,因此“双重羞耻”在我身上:)谢谢! – BillW 2010-03-05 04:25:17

相关问题