js 递归

递归会形成递归栈,栈顶是满足条件的最后一个函数,当这个函数出栈之后,倒数第二个栈的代码继续执行。(因为代码没执行完呢)

函数递归回来的结果值通常要保存或者赋值。这个很重要

递归不是闭包。

//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
}
原文地址:https://www.cnblogs.com/xiaoliziaaa/p/14374087.html