平常写代码,大脑跟着演算一遍过程、细节,写下代码。
但递归不同,如果跟着演算下去,会Stack Overflow,脑袋爆栈。
写递归不需演算所有细节。
写递归诀窍是理清规则。
举例
假设我们有一颗路由树,现要给每个路由节点,增加属性parentPointer,父指针,指向父节点对象,以便业务操作。
解:
- 第一步,理清规则。
该过程接收两个参数,一个是路由树节点,一个是父节点。
进入该过程时,如果函数给的parentPointer参数有值,那么this.parentPointer = parentPointer。
如果该节点没有children,那么结束。
如果该节点有children,那么重复此过程,并把当前节点给下一个过程。 - 第二步,实现。
function setParent(routeTreeNode, parentNode){
if(parentNode){
routeTreeNode.parentPointer = parentPointer
}
if(!routeTreeNode.children) return;
if(routeTreeNode.children.length <= 0) return;
routeTreeNode.children.forEach(rn=>{
setParent(rn,routeTreeNode)
})
}
setParent(路由树根节点, null)
于是,我们在没有演算递归的每个细节的情况下,仅通过理清所需规则,便写下了递归函数。