【发布时间】:2012-03-10 00:17:15
【问题描述】:
我有一个层次结构,它是一棵树,如果父赞助子节点,则节点就是子节点。看来我可以用这段代码遍历树
def get_team(self, person, team):
firstline = User.query(User.sponsor == person.key).fetch(99999999)
if firstline:
for person in firstline:
team.append(person)
newdownline = self.downline(person, team)
return team
使用上面的方法,我可以得到一个用户的组织
downline=user.get_team(user, [])
但是有没有更有效的方法,因为我必须为单个请求多次执行此操作,并且大量递归可能效率低下?或者代码会很好,因为它可以正确地遍历树?在我的第一个版本中,我使用了三个变量,我发现我可以将代码重新排列为只有两个变量,而不是这样:
def downline(self, person, team, teamlist):
firstline = User.query(User.sponsor == person.key).fetch(99999999)
if firstline:
for person in firstline:
teamlist.append(person)
newdownline = self.downline(person, team, teamlist)
team.append(newdownline)
return teamlist
我发现 teamlist 变量并不是真正需要的,所以我删除了它。我这样做的方式是首先使用一个变量太多:
people = user.downline(user, [], [])
【问题讨论】:
-
递归在哪里?您的意思是对
firstline的迭代吗? -
newdownline = self.downline(person, team, teamlist
-
您可以通过删除
person参数来优化可读性,与self.key相比并在循环中调用person.downline。你测量过程序有多快吗?你确定递归是瓶颈吗? -
我很困惑 - 实际代码是什么,以前的版本是什么?为什么不使用
person.get_team而不是self.downline,然后定义为downline=user.get_team? -
感谢 cmets。我不能做 person.get_team - 这就是我想要实现的。团队通过赞助商属性连接,其中父节点赞助子节点,赞助商属性在子对象中,所以我正在做的是尝试以递归方式遍历整个树。
标签: python google-app-engine recursion python-2.7 app-engine-ndb