Java 函数的计算结果为true,但将函数用作if语句的参数会显示false
我有一个任务,需要创建一个person对象Java 函数的计算结果为true,但将函数用作if语句的参数会显示false,java,recursion,boolean-logic,Java,Recursion,Boolean Logic,我有一个任务,需要创建一个person对象 class Person { private String name; public Person parent1 = null; public Person parent2 = null; public Person spouse = null; public int numChildren = 0; public LinkedList<Pe
class Person {
private String name;
public Person parent1 = null;
public Person parent2 = null;
public Person spouse = null;
public int numChildren = 0;
public LinkedList<Person> children = new LinkedList<Person>();
public Person(String n) {
name = n;
numChildren = 0;
}
Y-说明name2是否为name1的祖先
public static boolean Y(String name, String name2) {
if (name.equals(name2))
return true;
else if (findPerson(name).getParent1() != null)
Y(findPerson(name).getParent1().getName(), name2);
else if (findPerson(name).getParent2() != null)
Y(findPerson(name).getParent2().getName(), name2);
else if (findPerson(name2).getParent1() != null)
Y(findPerson(name2).getParent1().getName(), name);
else if (findPerson(name2).getParent2() != null)
Y(findPerson(name2).getParent2().getName(), name);
return false;
}
public static boolean Z(String name, String name2) {
LinkedList<Person> c1 = findPerson(name).getChildren();
for (int i = 0; i < findPerson(name).getNumChildren(); i++) {
if (c1.get(i).getName().equals(name2))
return true;
else if (c1.get(i).getNumChildren() != 0)
if (Z((c1.get(i).getChildren().get(0).getName()), name2))
return true;
}
return false;
}
Z-说明name2是否是name1的后代
public static boolean Y(String name, String name2) {
if (name.equals(name2))
return true;
else if (findPerson(name).getParent1() != null)
Y(findPerson(name).getParent1().getName(), name2);
else if (findPerson(name).getParent2() != null)
Y(findPerson(name).getParent2().getName(), name2);
else if (findPerson(name2).getParent1() != null)
Y(findPerson(name2).getParent1().getName(), name);
else if (findPerson(name2).getParent2() != null)
Y(findPerson(name2).getParent2().getName(), name);
return false;
}
public static boolean Z(String name, String name2) {
LinkedList<Person> c1 = findPerson(name).getChildren();
for (int i = 0; i < findPerson(name).getNumChildren(); i++) {
if (c1.get(i).getName().equals(name2))
return true;
else if (c1.get(i).getNumChildren() != 0)
if (Z((c1.get(i).getChildren().get(0).getName()), name2))
return true;
}
return false;
}
然而,当我试着给M(丹尼尔,凯文)打电话时,他们结婚了,即使他们是亲戚(他们可能是表亲)
我输入代码行:
System.out.println(name + ", " + name2);
在函数Y的顶部;对于上面的示例输入,输出为:
Daniel, Kevin
Jon, Kevin
Atticus, Kevin
Jane, Atticus
Atticus, Atticus
所以我们发现丹尼尔和凯文有一个祖父,阿提卡斯
我做了一个类似的print语句,并验证了我的函数对这个输入的求值是否为true,因为Y检查的第一件事是name.equals(name2),换言之,(“Atticus”).equals(“Atticus”)
但它不会触发M中的第二个if语句,我不知道为什么。我错过了一些非常简单的东西吗
如果您想查看我的其余代码,请告诉我,我将进行编辑。当且仅当名称相等时,您的函数
Y
将返回true
。它将运行所有其他检查,但最后返回false
。您可能是想返回递归调用的结果。做其余的工作吗?@RyanTurnbull是的,程序中的所有其他内容都按预期工作。是不是您的方法M
中的第一个if语句无论如何都会被执行?@delayrator否,这会检查两人的名字是否已经结婚,而事实并非如此。如果它确实执行了,那么它将打印出嵌套在其中的消息。当您使用了整个字母表的函数时会发生什么?(提示:我认为您应该使用更具体的名称,甚至可以将其命名为方法)您是正确的。我只是在递归调用之前抛出了一个返回,这就解决了问题。所以它被解析为true,但是没有返回的调用,所以它沿着行向下移动,最终返回false。我真傻。谢谢