Java 布尔递归第2部分

Java 布尔递归第2部分,java,recursion,Java,Recursion,正在尝试编写一个布尔函数,如果“m”是当前类的祖先,则该函数将返回true。”如果m'是妈妈或爸爸,或者是妈妈或爸爸的祖先,那么m'就是祖先 这能把我带到那里吗 public boolean isAncestor(member m){ if (mom == m || dad == m){ return true; } else{ if(isAncestor(m.mom) || isAncestor(m

正在尝试编写一个布尔函数,如果“m”是当前类的祖先,则该函数将返回true。”如果m'是妈妈或爸爸,或者是妈妈或爸爸的祖先,那么m'就是祖先

这能把我带到那里吗

public boolean isAncestor(member m){
        if (mom == m || dad == m){
            return true;
        }
        else{
            if(isAncestor(m.mom) || isAncestor(m.dad)){
                return true;
            }
        }
        return false;
    }

谢谢

逻辑会让你达到目的,但是你必须注意等号


在Java中,比较实例的相等性。随着时间的推移,很可能会有两个相对相等但存在于不同实例中的实例。如果您编写的代码是为了防止这种情况发生,那么您不需要将
=
更改为
.equals(…)
;但是,如果您没有设置任何保护措施来确保每个“相同”对象只存在一个实例,那么您可能希望将比较更改为
.equals(…)
,并实现一个自定义的“public boolean equals(object other){…}`method for the base”person“类。

如果要使用复发,则需要有一个停止条件。每个人都有妈妈还是爸爸?考虑这一点:

public boolean isAncestor(Member m) {
     // stop condition
    if(this.mom == null && this.dad == null) return false;
    // stop condition
    if(this.mom == m || this.dad == m) return true;
    // loop condition
    return mom.isAncestor(m) || dad.isAncestor(m);
}

可能是这样,但它不是100%正确的。您还应该检查妈妈和爸爸是否存在,否则可能会导致NullPointerException


此外,其他人的用法是正确的,相当可疑。

是的,或多或少。若你们到达了一个祖先的层次,在那个里妈妈或爸爸是未知的,并且是空的呢

public boolean isAncestor(member m){
        if (m == null)
            return false;
        if (mom.equals(m) || dad.equals(m))
            return true;
        else if(isAncestor(m.mom) || isAncestor(m.dad))
            return true;
        return false;
    }

如果没有关系,递归什么时候停止?

实际上,您需要一种方法来知道要比较哪两个成员的关系。您可能会想做这样的事情(未经测试):


您需要编写
isMom
isDad
来比较
m2
m1
之间的关系

您如何使用
=
操作符来比较
mom==m
dad==m
?停止条件…对了。doh!谢谢现在我想一想,你的方法如何知道它在比较哪两个人?我下面的答案实际上是比较两个成员,而不是一个给定成员的妈妈或爸爸状态。如果只知道一个家长呢?作为旁白,@Edwin使用
.equals()非常正确
需要一个条件来检查m是否为null,而不是
=
@6NSString good point。就这一点而言,这可能是OP想要的在树上走“错误的方向”。我没怎么想。这一点是为了说明检查以确保他们确实有父母的想法。这只是为了了解某人是否为父母,如果要比较他们的关系,实际上需要发送两个成员作为参数。请参阅下面我的答案。如果我们将此对象化,
isAnchestor
将是成员类的一个方法,因此您的第一个参数不是必需的。这取决于我们希望该方法在这种情况下执行的操作。如果有两份我的家庭,我还是另一份母亲的孩子吗?
/**
 * @param m1 the member we want to get ancestry from
 * @param m2 the member we presume is an ancestor
 */
public boolean isAncestor(member m1, member m2){
    if (m1 == NULL || m2 == NULL) {
        return false;
    }
    if (m1.isMom(m2) || m1.isDad(m2)){
        return true;
    }
    else if(isAncestor(m1.mom, m2) || isAncestor(m1.dad, m2)) {
        return true;
    }
    return false;
}