在特定的分离程度内交朋友

时间:2009-05-31 05:00:21

标签: python recursion

所有。我是一个非常非常新的程序员。我目前选择的语言是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 个答案:

答案 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,则ijn彼此分离的范围内。使用像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)