Java 函数的计算结果为true,但将函数用作if语句的参数会显示false

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

我有一个任务,需要创建一个person对象

    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。我真傻。谢谢