我目前正在研究一個問題,我必須通過Java中的遞歸找到友情鏈。統計上,一個人在大約6個航點上認識另一個人 - 這是我試圖找到的鏈條。Java:通過遞歸尋找友誼鏈
我有一類「人」,它定義了一個名稱和直接的朋友:
public class Person
{
private Person[] friendChain;
private String name;
public Person(String name, Person[] friendChain)
{
this.friendChain = friendChain;
this.name = name;
}
public Person[] getFriends()
{
return this.friendChain;
}
public String getName()
{
return this.name;
}
public boolean isFriendWith(Person person)
{
for(Person p: this.friendChain)
{
if(p != null && person != null && p.getName().equals(person.getName()))
return true;
}
return false;
}
public boolean equals (Person person)
{
return this.name.equals(person.getName());
}
public String toString()
{
return this.getName();
}
}
給出的圖是給出了一個例子鏈,在箭頭所指的單向或雙向關係(如托馬斯知道特蕾莎,但特里薩不知道托馬斯):
所以基本上我的成果應該類同是這樣的:
result = getFriendshipChain(adam, theresa);
result[0].getName(); // "Michael"
result[1].getName(); // "Kerstin"
result[2].getName(); // "Thomas"
result[3].getName(); // "Theresa"
result[4].getName(); // null
result[5].getName(); // null
過去我已經做了很多遞歸編程,但我現在無法讓我的頭腦進入 - 我會很感激任何幫助!
你不應該考慮鏈條,而是根據圖表。找一個圖庫,讓每個人都是一個頂點,每一個友誼都是一個邊緣,並要求它獲得最短的路徑。既然你談到方向,你應該找到一個有針對性的圖/ –
有關'Person#equals'的一些事情。首先你需要[滿足合同](http://stackoverflow.com/questions/3181339/right-way-to-implement-equals-contract)。其次,你需要[重寫'hashcode'](http://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java)。最後,你應該在'isFriendsWith'中使用它。 – bradimus
你爲什麼期望'結果[2]'只返回托馬斯?根據你的圖表,Krestin是Michael和Thomas的朋友,在穿越你的道路時不應該考慮這個問題嗎? – px06