2010-03-03 4 views
2

Qu'est-ce qui me manque dans GetLowestLevelFoo? Pourquoi ai-je la réponse A au lieu de D?Recherche récursive de l'élément de niveau le plus bas en 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; 
     } 
    } 

Répondre

11

Vous voulez seulement retourner foo quand vous êtes au plus bas niveau. Vous le retourniez quoi qu'il arrive. Si vous n'êtes pas au niveau le plus bas, vous devez renvoyer la valeur renvoyée par votre appel récursif.

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

Bah je suis sûr que j'ai essayé Merci –

1

Vous devez affecter foo avec le résultat de votre appel à GetLowestLevelFoo.

foo = GetLowestLevelFoo(foo.ChildFoo) 

sinon vous retournez ce que vous avez commencé.

2

modifié:

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

vous devez retourner quelque chose dans le SI, ainsi –

+0

mon mauvais frappe rapide au cours de la folle tableau de bord à suppl!.. y une réponse. –

+0

Je comprends. C'est impitoyable d'essayer de répondre aux questions ici. –

0

Comme d'autres ont maintenant commenté, votre code récursif à travers la pile, revenant chaque « niveau de « foo »: enfin le retour le plus élevé « noeud »

Essayez cette :..

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

    return GetLowestLevelFoo(foo.ChildFoo); 
} 
+0

@David B Vous avez absolument raison. Je vais éditer ma réponse. En fait, j'ai fait un pas à travers le code de l'OP et je l'ai regardé revenir en quatre saveurs, comme il "ramper" la pile, avant de poster ma réponse, donc "double honte" sur moi :) Merci! – BillW

Questions connexes