var traverseNode = function (node, i, arr, cb) {
cb(node, i, arr);
if (node.children) {
var children = node.children;
for (var i = 0; i < children.length; i++) {
var childNode = children[i];
traverseNode(childNode, i, children, cb) // 如何改成尾递归的形式
}
}
}
var traverseTree = function (tree, cb) {
for (var i = 0; i < tree.length; i++) {
traverseNode(tree[i], i, tree, cb)
}
}
谢谢。
1
autoxbc 2020-05-15 21:04:23 +08:00
尾递归有这么几个要点:
1. 计算出中间结果,传递给下一次运算 2. 怎样得到下一次计算需要的数据 3. 递归终点 对于在结构数据上递归,第二条稍微复杂一些。数据不是一维的,那么需要设计一个无遗漏,最好也不重复的迭代规则 不确定你的函数怎么改写成尾递归,我只是写了一个简单的深度优先的节点遍历 function traverseNode( node , cb , top , back ) { var top = top || node ; if( back || node.children.length === 0 ) { cb(node); if( node === top ) return; if(node.nextElementSibling) return traverseNode( node.nextElementSibling , cb, top ); if(node.parentNode) return traverseNode( node.parentNode , cb , top , true ); } else { return traverseNode( node.children[0] , cb , top ); } } 以及,对于节点这种特殊数据,有更好的方法可以一次获得所有子节点(包括自身) [ node , node.querySelectorAll('*') ] |
2
autoxbc 2020-05-15 21:13:45 +08:00
top 参数的意思是,当递归回自身时,表示已经处理所有节点,所以直接退出
back 参数的意思是,从子节点返回父节点时,告诉函数子节点已处理完毕 |