写递归的诀窍

125 阅读1分钟

平常写代码,大脑跟着演算一遍过程、细节,写下代码。
但递归不同,如果跟着演算下去,会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)

于是,我们在没有演算递归的每个细节的情况下,仅通过理清所需规则,便写下了递归函数。