我有一项要求创建人物对象的作业。
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语句,我不知道为什么。我错过了一些非常简单的东西吗?
如果您想查看我的其余代码,请告诉我,我会进行修改。
答案 0 :(得分:0)
当且仅当名称相等时,您的函数ipc
才会返回Y
。它将运行所有其他检查,但最后返回true
。您可能想要返回递归调用的结果。