2010-03-03 67 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

相關問題