<p>使用递归,您需要关注基本情况和递归情况。
无论您的基本情况是什么,如果您希望能够从递归中收集信息,它们必须返回递归案例可以(而且更重要的是)使用的数据。类似地,您需要确保递归案例返回的数据可以相互使用。在</p>
<p>首先确定基本情况和递归情况。
基本情况是“叶”节点,没有子节点。在基本情况下,您只想返回一些数据,而不想再次调用递归函数。这就是他们所说的“备份堆栈”并防止无限递归的原因。
递归情况将要求您保存从一系列递归调用中收集的数据,这几乎就是您在<code>for</code>循环中所做的工作。在</p>
<p>我注意到你</p>
<pre><code># Recursive case: node has one or more child
if len( children ) >= 1 :
# Loop through all the children
for child in children:
# call to recursion function
getCoords( child, searchNode )
</code></pre>
<p>但是你怎么处理你的getCoords调用的结果呢?在</p>
<p>您可以将结果保存在某种数据结构中,您可以在for循环结束时返回,或者如果您不想保存结果本身,只需在到达基本情况1(成功搜索)时打印它,而不是返回它。因为现在你的基本情况1只是向上返回一个对结果没有任何作用的实例!所以试试看:</p>
^{pr2}$
<p>既然你的结果在一个列表中,并且你使用了<code>extend()</code>方法,那么你也必须让你的基本情况返回列表!在</p>
<pre><code># Base case 1: does not have children and is the 'searchNode'
elif len( children ) == 0 and child.tag == searchNode:
# Return the text from the node, inside a list
return [child.text]
# Base case 2: doesn't have children and does not match 'searchNode'
else:
# Return empty list so your extend() function knows what to do with the result
return []
</code></pre>
<p>最后应该只给你一个列表,你可能想把它存储在一个变量中。我刚刚把结果打印在这里:</p>
<pre><code>searchNode = 'coordinates'
# loop through all 'Placemark nodes' in document
for mark in placemark:
# Get children of 'Placemark' node
children = mark.getchildren()
# I imagine that getchildren() might return None, so check it
# otherwise you'll get an error when trying to iterate on it
if children:
# Loop through children nodes
for child in children:
# if a 'Polygon' node is found
if child.tag == 'Polygon':
# call recursion function and print (or save) result
print getCoords( child, searchNode)
</code></pre>