函数求值为true,但使用函数作为if语句的参数显示为false

时间:2017-11-14 08:52:20

标签: java recursion boolean-logic

我有一项要求创建人物对象的作业。

    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语句打印出一个消息结束退出该函数。

其他相关功能:
P - 记录该名称是name2的父级。
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(丹尼尔,凯文)时,它会嫁给他们,即使他们是相关的(他们会是表兄弟)。

我输入了代码行:

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

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

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

所以发现Daniel和Kevin分享了一位祖父Atticus。

我做了一个类似的print语句并验证我的函数对此输入的评估为true,因为Y检查的第一件事是name.equals(name2),换句话说,(“Atticus”)。equals(“阿提库斯“)。

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

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

1 个答案:

答案 0 :(得分:0)

当且仅当名称相等时,您的函数ipc才会返回Y。它将运行所有其他检查,但最后返回true。您可能想要返回递归调用的结果。