递归添加到集

时间:2017-03-28 19:58:06

标签: python python-3.x recursion

我试图用这个函数def friends(self, name, degree):包围递归函数。这个的目的是将所有朋友的集合返回到指定的程度(对于地址簿)。它是名为class SocialAddressBook:的较大类的最后一部分。该程度'在此课程中,用户可以查询'朋友的朋友:一级是直接的朋友,二级是朋友的朋友,依此类推。我的代码是

def friends(self, name, degree):
    fs = set()
    if degree == 0:
        return set()
    if degree == 1:

就我对此的了解而言...... 还有一些背景:

  

传递友谊:

Fred → Barb → Jane → Emma → Lisa
Fred → Sue
              Jane → Mary

所以我的测试是:a.friends('Fred', 1) == {'Barb', 'Sue'}

a.friends('Fred', 2) == {'Barb', 'Jane', 'Sue'}

a.friends('Fred', 3) == {'Mary', 'Barb', 'Jane', 'Sue', 'Emma'}

a.friends('Fred', 4) == {'Barb', 'Emma', 'Mary', 'Lisa', 'Sue', 'Jane'}

它只能达到4级。所以我应该递归地执行此操作,还是仅仅手动执行此操作,因为我知道它达到的程度?

如果有人能指出我如何以递归的方式完成这个,那就太棒了,谢谢!

2 个答案:

答案 0 :(得分:2)

我会说迭代地执行此操作:只需将其添加到当前列表 n 次,其中 n 是输入参数。

fs = set(self)
for i in range (n):
    wider = set()
    for chum in fs.copy():
        for new_chum in chum.friend_list:
            fs += new_chum

在每个级别,从当前集合的朋友中制作更广泛的集合。完成所有这些操作后,将它们添加到朋友集中。重复 N 次。

答案 1 :(得分:2)

最好迭代地执行此操作。

def get_friends_iteratively(self, name, degree)
    if degree < 0:
        raise ValueError('degree should be an int >= 0')
    if degree == 0:
        return set() # no friends of degree 0!
    friends = self.friends
    for _ in range(degree):
        new_friends = set()
        # it is important not to change a set while we iterate through it.
        # thus, we change new_friends, then update friends when we are done.
        for other_person in self.friends:
            new_friends |= other_person.friends
        friends |= new_friends
    return friends

    # In python, the |= ('in-place or') operator updates a set with
    # the union of itself and another set.