【javascript】递归调用函数功能

105 阅读1分钟

求阶乘:

 /* 求阶乘 */
function fun(n) {
  if (n == 1) return 1
  return fun(n - 1) * n
  i--;
}
console.log(fun(3));

斐波那契数列:

/* 斐波那契数列 */
    function fbnq(num) {
      if (num == 1 || num == 2) return 1


      return fbnq(num - 1) + fbnq(num - 2)
      num--;
    }
    console.log(fbnq(6));

递归遍历数据:

 /* 递归遍历数据 */
    var data = [
      {
        "id": 1,
        "name": "家电",
        "goods": [
          {
            "id": 11,
            "gname": "冰箱",
            "goods": [
              {
                "id": 111,
                "gname": "海尔"
              }, {
                "id": 112,
                "gname": "美的"
              }
            ]
          },
          {
            "id": 12,
            "gname": "洗衣机"
          }
        ]
      },
      {
        "id": 2,
        "name": "服饰"
      }
    ];

    function getId(json, id) {
      var o = {};
      json.forEach(function (item) {
        if (item.id == id) {
          o = item
        }
        else if (item.goods && item.goods.length) {
          o = getId(item.goods, id)
        }
      })
      return o
    }
    console.log(getId(data, 1));
    console.log(getId(data, 2));
    console.log(getId(data, 111));
    console.log(getId(data, 211));

树形结构和平铺结构的转换:

1. 正向-树形结构转平铺

// 正向-树形结构转平铺
// 从外到内依次递归,有 children 则继续递归
function treeToArr(data, pid=null, res=[]) {
  data.forEach(item => {
    res.push({ pid: pid, id: item.id, name: item.name });
    if(item.children && item.children.length !== 0) {
      treeToArr(item.children, item.id, res);
    }
  });
  return res;
};

const arr = treeToArr(data);
console.log(arr);

2. 逆向-平铺结构转树形

// 依次在数组中找到每一层级对应的元素,同时每个元素的 children 属性对应的 value 通过 pid 去找到,然后递归执行下去
function arrToTree(arr, pid=null) {
  const res = [];
  arr.forEach(item => {
    if(item.pid === pid) {
      // 这样每次都需要遍历整个数组,因此时间复杂度为 n*n
      // const children = arrToTree(arr, item.id)   

      // 往下递归时,每次数组的大小都在减小,每次都筛选掉父代元素,最终的时间复杂度为 n*logn
      const children = arrToTree(arr.filter(v => v.pid !== pid), item.id);
      if(children.length) {
        res.push({ ...item, children })
      }else {
        res.push({ ...item })
      }
    }
  });
  return res;
};

const tree = arrToTree(arr);
console.log(JSON.stringify(tree, null, 2));