获取特定关系度内的朋友
大家好。我是一个非常非常新的程序员。目前我选择的编程语言是Python,我觉得自己对它有一点了解。我刚开始学习递归。(顺便问一下,如果有人能推荐一个好的学习资料,请告诉我!)我想让大家知道,我的问题非常基础,我发的代码也非常非常糟糕。
总之,我想写一个函数,能够获取指定层数内的所有朋友。如果我传入0作为层数,我只想要我自己。如果传入1,我想要我和我所有的朋友。如果传入2,我想要我、我的朋友以及他们所有的朋友,依此类推。
我尝试了很多不同的方法来实现这个功能,但都没有成功。我试着想象理论上它应该如何运作,但由于我在这个领域经验不足,我也想不明白。也许这里有好心人能告诉我这段代码哪里出错了,并解释一下正确的做法,或者推荐一个好的学习资料。下面是我的代码:
def getFriends(self,degree,friendList):
if degree == 0:
friendList.append(self)
return friendList
else:
friendList = friendList.append(self)
for each in self.friends:
each.getFriends(degree-1,friendList)
它没有工作,我知道我做了很多愚蠢的事情。请有人给我点醒,指引我正确的方向!
谢谢。
5 个回答
你可以把 friendList.append(self) 移到 if 语句之前,因为在两种情况下你都需要它。而且你也不需要把结果赋值给 friendlist,这其实是个错误。
在你的算法中,可能会出现把同一个人添加两次的情况,比如 A 是 B 的朋友,而 B 也是 A 的朋友。所以,你需要保持一个已经处理过的朋友的集合。在处理之前,先检查一下这个集合,如果这个人已经处理过了,就什么都不做。
你的缩进正确吗?方法的内容部分应该相对于它的定义进行缩进。
friendList = friendList.append(self)
这段代码把 friendList
设置成了 None
,这是因为任何列表的 append
方法总是返回 None
,所以我们得先解决这个奇怪的问题...!
一旦你解决了这个问题,你还需要修改这个函数,让它总是返回一些东西——如果函数没有明确返回值,就会返回 None
。比如:
def getFriends(self,degree, friendList):
if degree == 0:
friendList.append(self)
return friendList
else:
friendList.append(self)
for each in self.friends:
each.getFriends(degree-1, friendList)
return friendList
这个代码可以明显地进行重构,去掉重复的部分(DRY,意思是“不要重复自己”,这是编程的核心原则...):
def getFriends(self,degree, friendList):
friendList.append(self)
if degree > 0:
for each in self.friends:
each.getFriends(degree-1, friendList)
return friendList
顺便说一下,这个 alist=alist.append(...)
的问题,正是我在2002年重新联系上我妻子安娜的原因(我们在很多年前是朋友,但后来失去了联系)——她开始学习Python,正好用到了这个错误的写法,搞不懂为什么会出错——于是她在Python社区里四处寻找,看到并认出了我的名字,给我发邮件询问这件事……不到两年后我们就结婚了,之后她成为了Python软件基金会的第一位女性成员,并且是《Python Cookbook》第二版的合著者。所以,我对这个特定的Python错误有着特别的情感...;-)。