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

Function evaluates to true, but using function as parameter of if-statement shows false

我有一个任务要求创建一个人对象。

    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;
        }

我程序的三个函数,M、Y 和 Z,执行以下操作:

M — 嫁给两个人。

        public static void M(String name, String name2) {
            if (findPerson(name).getSpouse() != null && findPerson(name).getSpouse().getName().equals(name2))
                System.out.println(name + " and " + name2 + "are already married.");
            else if (Y(name, name2) || Z(name, name2) || Z(name2, name))
                System.out.println("Unable to complete action. " + name + " and " + name2 + " are related.");
            else if (findPerson(name).spouse != null)
                System.out.println(findPerson(name).getName() + " is already married.");
            else if (findPerson(name2).spouse != null)
                System.out.println(findPerson(name2).getName() + " is already married.");
            else
                findPerson(name).marry(findPerson(name2));
        }

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;
        }

Z — 说明 name2 是否是 name1 的后代。

        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;
        }

我使用 Y 和 Z 来确定 name 和 name2 是否有任何关联。如果是,则在函数 M 中,第二个 if 语句打印出消息 end exits the function.

其他相关函数:
P — 记录名称是名称 2 的父级。
T — 打印出指定人的后代树。

我一直在使用的测试输入示例:

    O Jon  
    O Jane  
    O Daniel  
    O Kevin  
    O Atticus  
    P Atticus Jon  
    P Atticus Jane  
    P Jon Daniel  
    P Jane Kevin  
    T Atticus

    Atticus
        |---->Jon
        |       |--->Daniel
        |---->Jane
                |--->Kevin

然而,当我尝试打电话给 M(Daniel,Kevin)时,它与他们结婚,即使他们是相关的(他们将是堂兄弟)。

我输入的代码行:

    System.out.println(name + ", " + name2);

在函数Y的顶部;对于上面的示例输入,输出为:

    Daniel, Kevin
    Jon, Kevin
    Atticus, Kevin
    Jane, Atticus
    Atticus, Atticus

因此发现 Daniel 和 Kevin 有一个祖父 Atticus。

我做了一个类似的打印语句并验证了我的函数对于这个输入的计算结果为真,因为 Y 检查的第一件事是 if name.equals(name2),换句话说,("Atticus").等于("Atticus").

但它没有触发 M 中的第二个 if 语句,我不知道为什么。我错过了一些非常简单的东西吗?

如果您想查看我的其余代码,请告诉我,我会进行编辑。

当且仅当名称相等时,您的函数 Y 将 return true。它将 运行 所有其他检查,但最后 return false。您可能打算 return 递归调用的结果。