获取特定关系度内的朋友

8 投票
5 回答
2073 浏览
提问于 2025-04-15 11:56

大家好。我是一个非常非常新的程序员。目前我选择的编程语言是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 个回答

1

你可以把 friendList.append(self) 移到 if 语句之前,因为在两种情况下你都需要它。而且你也不需要把结果赋值给 friendlist,这其实是个错误。

在你的算法中,可能会出现把同一个人添加两次的情况,比如 A 是 B 的朋友,而 B 也是 A 的朋友。所以,你需要保持一个已经处理过的朋友的集合。在处理之前,先检查一下这个集合,如果这个人已经处理过了,就什么都不做。

1

你的缩进正确吗?方法的内容部分应该相对于它的定义进行缩进。

14
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错误有着特别的情感...;-)。

撰写回答