如何以递归方式返回直接对象中的“玩具”项目数以及该对象的所有直接子项

时间:2017-08-24 03:18:54

标签: c# .net recursion

有一个Person类,它包含以下内容:

  • int toys
  • 列出儿童
  • SumToys()

SumToys()返回直接对象中的所有“玩具”(正在调用SumToys)及其直接子项(不是儿童的子项)。

class Person
{
    private static int toys;
    private static List<Person> children = new List<Person>();

    //Constructor
    public Person(int toysInput, List<Person> childrenInput)
    {
        toysInput = toys;
        childrenInput = children;
    }

    //Returns its own toys and direct children but NOT children of children
    public static int SumToys(List<Person> children)
    {
        int toysTotal = toys;

        for(int i = 0; i < children.Count; i++)
        {
            toysTotal += children[i].SumToys(); //I am trying to call SumToys but it says to 'qualify it as a type name instead

        }

        return toysTotal;
    }
}

这是树应该是什么样子的草图:

What the tree should look like

因此,如果我在对象2上调用SumToys,它应该返回13.如果我在对象4上调用它,那么它应该返回4.

1 个答案:

答案 0 :(得分:3)

从班级成员中删除所有static个关键字。静态成员的值在不同的类实例之间共享。

修复构造函数以更新类成员而不是更新提供的输入参数

Toys成员公开阅读并在总金额计算中使用它 当你给孩子打电话SumToys时,它会计算所有后代的玩具总量。

您不需要提供子项作为SumToys的参数,因为已经在构造函数中给出了子项。

public class Person
{
    public int Toys { get; };
    private List<Person> children;

    public Person(int toys, List<Person> childrens)
    {
        ToysInput = toysInput;
        children = childrenInput;
    }

    public int SumToys()
    {
        var total = toys;

        for(int i = 0; i < children.Count; i++)
        {
            toysTotal += children[i].Toys;
        }

        return total;
    }
}

使用类看起来像

var four = new Person(4, new List<Person());
var five = new Person(5, new List<Person());
var six = new Person(6, new List<Person());
var two = new Person(2, new List<Person { five, six });

four.SumToys() // return 4
two.SumToys() // return 13

作为计算玩具总和的替代方法,您可以使用LINQ

public int SumToys()
{
    return children.Aggregate(Toys, (total, child) => total += child.Toys);
}