所有。我是一个非常非常新的程序员。我目前选择的语言是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)
它不起作用,我知道我做了愚蠢的,愚蠢的事情。有人请打我,指出我正确的方向!
感谢。
答案 0 :(得分:14)
friendList = friendList.append(self)
这会无条件地将friendList
设置为None
,因为这是任何列表的append
方法的不变返回值 - 因此,首先修复 怪异。 ..! - )
一旦你修复了这个问题,你仍然需要修复这个函数,以便它始终以return
的某些东西结束 - “从结尾掉下来”返回None
。 E.g:
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
可以并且显然应该重构以消除重复(干,不要重复自己,是编程的核心......):
def getFriends(self,degree, friendList):
friendList.append(self)
if degree > 0:
for each in self.friends:
each.getFriends(degree-1, friendList)
return friendList
PS:那个(alist=alist.append(...)
问题)正是我是如何在2002年与我的妻子安娜取得联系的(我们多年前一直不是很甜心的朋友,但是已经失去了彼此的追踪) - 她开始学习Python,正是使用了这个错误的结构,无法理解它失败的原因 - 环顾Python社区,看到并认出了我的名字,邮寄给我询问它...两年后,我们结婚了,不久之后,她成为了Python软件基金会的第一位女性成员,也是我在“Python Cookbook”第二版中的合着者。所以,当然,对于这个特定的Python错误,我有一个令人难以置信的最佳点......; - )。
答案 1 :(得分:1)
您可以将friendList.append(self)移动到if之前的行 - 在两种情况下都需要它。您也不需要将结果分配给好友列表 - 这是一个错误。
在你的算法中,你可能会两次添加相同的人 - 如果A是B的朋友而B是A的朋友。所以,你需要保留一组你已经处理过的朋友。在处理之前,请检查此设置,如果已经处理了此人,则不要执行任何操作。
答案 2 :(得分:1)
你的身份是否正确?方法的主体应该相对于它的定义缩进
答案 3 :(得分:1)
return
子句中没有else
语句。因此,如果degree != 0
,此方法将始终返回None
。您希望将每个递归getFriends
调用的结果附加到friendList
,然后返回friendList
。
顺便说一句,如果你想让这个算法更快,那么有很好的方法可以用图算法或矩阵操作来做到这一点。例如,如果您使用邻接矩阵A
表示友谊关系,并且您想要找到彼此相距n
度的所有人,则可以计算B=A^n
。如果B[i][j] > 0
,则i
和j
在n
彼此分离的范围内。使用像NumPy这样的包时,矩阵乘法很容易。
答案 4 :(得分:1)
(对不起,我无法评论Alex的答案...... 还)
我真的不喜欢getFriends返回一个从未使用过的值的想法。它确实有效,但看起来有点吸引人;) 此外,对getFriends的第一次调用将是self.getFriends(degree,[]),这令人困惑:获取朋友列表时,为什么你会将一个空列表作为参数传递,对吧?
为清楚起见,我认为我更喜欢这个略有不同的版本,使用_getFriends帮助函数:
def getFriends(self, degree):
friendList = []
self._getFriends(degree, friendList)
return friendList
def _getFriends(self, degree, friendList):
friendList.append(self)
if degree:
for friend in self.friends:
friend._getFriends(degree-1, friendList)