我有一个需要高效遍历的XML文档(递归访问所有节点)。
我不确定我是否习惯使用递归模式,所以我想到了其他模式。我是不是太偏执了,我应该只使用递归模式吗?在过去,当递归函数的大小增加时,越来越难以找到发生运行时错误的堆栈,并可视化问题。
答案 0 :(得分:1)
如果要递归访问XML文档中的所有元素,使用递归肯定是明显的选择。如果您在查看问题时遇到问题,因为您的递归函数太大而且您不知道发生了运行时错误的堆栈,那么调试技术的问题比递归本身更容易发生。
但是如果你真的决定这样做,你可以构建一个遍历XML而不使用递归的访问者对象。相反,您必须构建一个列表(好吧,哈希表),列出您到目前为止访问过的所有元素。访客的一些伪代码:
while current_element != null:
if current_element not in elements_visited:
process current_element
add current_element to elements_visited
next_element = null
for each child of current_element:
if child is not in elements_visited:
next_element = child
break
if next_element == null:
next_element = current_element.parent
current_element = next_element
这不会维护堆栈,但是每次重新访问元素时都会通过遍历子轴来为它付费。 (你可以通过存储elements_visited
条目中访问的最后一个子元素的索引并将其作为循环子元素循环的起点来解决这个问题。这还不够复杂吗?)