Java 布尔递归第2部分
正在尝试编写一个布尔函数,如果“m”是当前类的祖先,则该函数将返回true。”如果m'是妈妈或爸爸,或者是妈妈或爸爸的祖先,那么m'就是祖先 这能把我带到那里吗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
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;
}