递归计算嵌套向量

时间:2018-01-13 00:38:48

标签: java recursion vector tree

我想计算特定Vector内部的唯一对象的数量。例如,我有一个Person的班级Vector<Person> family。我试图找到一种方法来计算大家庭的长度。人们之间可能存在关系,例如: -

Mike is related to Pete;
Mike is related to John;
John is related to Amy;
迈克将有一个4人的大家庭(包括他自己)。

我认为唯一的方法是使用递归,到目前为止我有类似的东西。

   public int getExtendedFamily(Person person) {

            // Add the current person if he/she does not exist
            if (!(lineage.contains(person))) {
                lineage.add(person);

                // If the person has no direct family
                if (person.getFamily().size() == 0)
                    return lineage.size();
                else {
                    // Otherwise iterate through the family members
                    for (Person familyMember : person.getFamily()) {
                        return lineage.size() + getExtendedFamily(familyMember);
                    }
                }
            } else {
                // Person already exists...
                return lineage.size();
            }

            return 0;
        }

我创建了一个新的向量lineage来跟踪我遇到的独特人物。

显然我知道我的这段代码还有一段路要走,因为我的lineage.size()不对。我只是无法理解如何构建递归,任何指南都将不胜感激。即使它只是伪代码!

亲切的问候, 本

更新的代码,似乎可以正常工作

public int getExtendedFamily(Person person) {

    // If the person exists just return counter, 
    //and go back up the call stack;
    if ((lineage.contains(person))) {
        return counter;
    } else {

        // Otherwise add the person to the lineage data structure
        // and continue
        lineage.add(person);

        // Loop through current persons family
        for (Person family_member_ : person.getFamily()) {

            // If the current family member index is not in the lineage
            // then increase the counter and recursively call getExtendedFamily,
            // to count that persons unique family members.

            if (!lineage.contains(family_member_)) {
                counter++;
                getExtendedFamily(family_member_);
            };
        }
    }
    return counter;
}

1 个答案:

答案 0 :(得分:0)

假设关系全部保存,它可能只是向量的大小加一。

如果你进入世代,祖父母没有报告后代,那么递归的方法就是返回向量的大小,如果没有孩子就返回。

如果没有要求完全保存关系,请将一个集传递给递归函数并保存到集合中。向量为0时返回。