代码之家  ›  专栏  ›  技术社区  ›  Iain Holder

递归地查找c中的最低级别项#

  •  2
  • Iain Holder  · 技术社区  · 14 年前

    在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;
            }
        }
    
    4 回复  |  直到 14 年前
        1
  •  11
  •   Seth Moore    14 年前

    你只想在最底层的时候返回foo。不管怎样,你都会还给我的。如果不在最低级别,则应返回递归调用返回的值。

    public Foo GetLowestLevelFoo(Foo foo)
        {
            if (foo.ChildFoo != null)
            {
                return GetLowestLevelFoo(foo.ChildFoo);
            }
            else
            {
                return foo;
            }
        }
    
        2
  •  2
  •   Bryan Rowe    14 年前

    编辑:

    public Foo GetLowestLevelFoo(Foo foo)
    {
        if (foo.ChildFoo != null)
        {
            return GetLowestLevelFoo(foo.ChildFoo);
        }
        return foo;
    }
    
        3
  •  1
  •   Nate Heinrich    14 年前

    您需要将foo与调用getlowestlevelfoo的结果一起分配给foo。

    foo = GetLowestLevelFoo(foo.ChildFoo)
    

    否则你就要把开始的东西还给我。

        4
  •  0
  •   BillW    14 年前

    正如其他人现在评论的那样,您的代码在堆栈中递归,返回每个“foo级别”:最后返回最顶层的“节点”。

    试试这个:

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