递归会形成递归栈,栈顶是满足条件的最后一个函数,当这个函数出栈之后,倒数第二个栈的代码继续执行。(因为代码没执行完呢)
函数递归回来的结果值通常要保存或者赋值。这个很重要
递归不是闭包。
//5*4*3*2*1=120 //f5=5*f4 f4=4*f3 f3=3*f2 f2=2*f1 f1=1 1*2*3*4*5=f5=120 //累积递归 function f(a) { if (a <= 1) return 1 return a * f(a - 1) //递归函数基本都要返回值或者保存值 }
//f2=f1+1 f3=f2+2 f4=f3+3 f5=f4+4 10+9+8+7+6+5+4+3+2+1 f10=10+f9 f9=9+f8 f8=8+f7 ... f2=2+f1 f1=1 f10=10+9+8+...+2+1 //求和递归 function fn1(num) { if (num <= 1) return 1 return num + fn1(num - 1) //返回值 }
const data = [{ id: 1, name: "美食", goods: [{ id: 11, gname: "螺蛳粉" }, { id: 12, gname: "臭豆腐" }] }, { id: 2, name: "水果" }]; function getID(data, id) { // debugger let obj for (let item of data) { if(item.id===id) { obj=item //父节点找不到就尝试找下子节点 }else{ if(item.goods&&item.goods.length){ obj=getID(item.goods,id) //赋值 } } } return obj } console.log(getID(data, 1)) console.log(getID(data, 11))
//将虚拟节点 变为真实节点 function createElm(vnode){ let {tag,children,key,data,text}=vnode if(typeof tag=="string"){ vnode.el=document.createElement(tag) children.forEach(child=>{ vnode.el.appendChild(createElm(child)) //递归 }) }else{ vnode.el=document.createTextNode(text) } return vnode.el }