我试图用这个函数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级。所以我应该递归地执行此操作,还是仅仅手动执行此操作,因为我知道它达到的程度?。
如果有人能指出我如何以递归的方式完成这个,那就太棒了,谢谢!
答案 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.