Java:通过递归找到友谊链

时间:2016-11-18 13:42:04

标签: java recursion

我目前正在研究一个问题,我必须通过Java中的递归找到友谊链。从统计数据来看,一个人在大约6个航点上认识另一个人 - 这是我想要找到的链条。

我有一个“人”类,它定义了一个名字和直接的朋友:

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

给出了一个示例链,其中箭头表示单向或双向关系(如Thomas知道Theresa,但Theresa不知道Thomas): Example chain

所以基本上我的结果看起来应该像这样:

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

我过去做了很多递归编程,但我现在无法理解这一点 - 我很感激任何帮助!

1 个答案:

答案 0 :(得分:1)

以下是一个示例,但要小心,只有当您的图表只有一个类似于示例图片的路径时才能使用

如果这不足以满足您的需求,至少第一步和第二步(也许是第三步)也应该有所帮助:

1)您只接受00A0的构造函数中的friendsChain,但是如何传递尚未创建的Person个对象链? 这是循环创建依赖;我建议使用较轻的构造函数以及Person的setter删除问题。

friendChain

2)让我们构建public Person(final String name) { this.name = name; } public void setFriendChain(final Person[] friendChain) { this.friendChain = friendChain; } 个对象并填充他们的朋友链

Person

3)让我们构建一个跟随朋友链的递归方法(注意我们使用Person adam = new Person("Adam"); Person michael = new Person("Michael"); Person kerstin = new Person("Kerstin"); Person thomas = new Person("Thomas"); Person theresa = new Person("Theresa"); Person[] adamsFriends = { michael, kerstin }; adam.setFriendChain(adamsFriends); Person[] michaelsFriends = { adam, kerstin }; michael.setFriendChain(michaelsFriends); Person[] kerstinsFriends = { thomas, adam, michael }; kerstin.setFriendChain(kerstinsFriends); Person[] thomasFriends = { kerstin, theresa }; thomas.setFriendChain(thomasFriends); Person[] theresasFriends = { thomas }; theresa.setFriendChain(theresasFriends); ,因为我们不知道链的最终大小):

List

4)称之为:

public void getFriendshipChain(final Person from, final Person to, final List<Person> friendshipChain) {

    friendshipChain.add(from);

    // We have found the target person, return
    if (from.equals(to)) {
        return;
    }

    // For every friend from that person
    for (Person friend : from.getFriendChain()) {

        // If we don't already have it in the list
        if (!friendshipChain.contains(friend)) {

            // follow this friend's chain
            getFriendshipChain(friend, to, friendshipChain);

        }
    }

}