第二个递归问题。我需要为递归函数中的值分配唯一的ID。
考虑文件夹结构,其中每个文件夹可以包含项目或其他文件夹。但每个人都需要一个独特的“身份”。
我想,因为我不能在python中的递归函数中使用任何全局变量,所以我会在每次调用时递增id。但我不能错。想想以下情况。
1 - 文件夹
2-文件夹
3 - 项目
4 - 项目
2 - 文件夹
由于递归的工作方式,id被分配两次,并且无法检查。我该怎么做呢? (我正在使用python。每当我有一个变量'uniqueid',我会增加,我得到错误:
在赋值之前引用的局部变量'uniqueid'
) 我的代码:make_link_item只返回一个字符串。
def build_xml(node,depth,itemid):
#if 'Children' in node:
#print colleges
depth += 1
for child in node['Children']:
itemid += 1
print (" " * (depth - 1)) + "<item identifier=\"%s\" identifierref=\"%s\">" % (("itm" + ("%05d" % itemid)),("res" + ("%05d" % itemid)))
print (" " * depth) + "<title>%s</title>" % child['Name'].encode('utf-8')
build_xml(child,depth,itemid)
print (" " * (depth - 1)) + "</item>"
lectures = getlectures(node['Id'])
if lectures:
build_lectures(lectures,itemid,itemid)
def build_lectures(lectures,itemid,parentid):
for x in range(len(lectures)):
itemid += 1
if x % 2 == 0:
print "<item identifier=\"%s\" identifierref=\"%s\">" % (("itm" + ("%05d" % itemid)),("res" + ("%05d" % itemid)))
print "<title>" + lectures[x].encode('utf-8') + "</title>"
print "</item>"
else:
make_link_item(lectures[x-1].encode('utf-8'),lectures[x].encode('utf-8'),itemid,parentid)
谢谢,
垫
答案 0 :(得分:1)
我希望我不会错过这个问题。
你可以使用class Builder
作为构建xml arborescence的对象。您的班级有一名成员increment
,每当您遇到一个新项目时,您会加1。这样,就没有两个相同的ID。
class Builder:
def __init__(self):
self.increment = 0
#other methods you need
答案 1 :(得分:0)
使用集合中的Counter()类帮助计算出来。
出于某些明显的原因:
counter = Counter()
工作正常,我可以像这样增加它。
counter['id'] += 1
甚至在我的递归循环中。我不知道为什么,但我认为它与引用传递和值传递有关。
答案 2 :(得分:0)
您可以让每个build_xml调用返回其子项的最大标识符。然后你可以将下一个节点设置为该id + 1.类似于:
def build_xml(node,depth,itemid):
depth += 1
for child in node['Children']:
itemid += 1
print (" " * (depth - 1)) + "<item identifier=\"%s\" identifierref=\"%s\">" % (("itm" + ("%05d" % itemid)),("res" + ("%05d" % itemid)))
print (" " * depth) + "<title>%s</title>" % child['Name'].encode('utf-8')
itemid = build_xml(child,depth,itemid)
print (" " * (depth - 1)) + "</item>"
lectures = getlectures(node['Id'])
if lectures:
build_lectures(lectures,itemid,itemid)
return itemid