2010-03-03 4 views
2

GetLowestLevelFoo에 무엇이 누락 되었습니까? 왜 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

바하마 나는 내가 그 시도 확신 주셔서 감사합니다 –

1

GetLowestLevelFoo를 호출 한 결과를 foo에 지정해야합니다.

foo = GetLowestLevelFoo(foo.ChildFoo) 

그렇지 않으면 내가 시작한 것을 반환합니다.

2

편집 : 다른로서

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

당신은뿐만 아니라 IF 내에서 뭔가를 반환해야 –

+0

내 나쁜 빠른 입력을 미친 대시 동안 Suppl에에!.. 대답. –

+0

나는 이해한다. 무자 비한 질문에 대답하려고 노력합니다. –

0

지금 댓글을 달았, 코드는 foo는 각각의 "수준"을 반환 스택을 통해 다시 재귀 ": 마지막으로 최상위 반환."노드를 "

이 시도 :..

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

    return GetLowestLevelFoo(foo.ChildFoo); 
} 
+0

@ David B 당신은 절대적으로 맞습니다. 나는 나의 응답을 편집 할 것이다. 사실 OP의 코드를 한 단계 밟아서 네 응답으로 'foo'를 반환하는 것을 보았습니다. 응답을 게시하기 전에 스택을 "크롤링"하여 나와 "이중 수치"를했습니다 :) 감사합니다! – BillW

관련 문제