天天看点

浅析递归在项目中的运用

一、介绍

​ 递归顾名思义,就是一个函数直接或间接的调用自身,并在满足边界条件后,结束函数。这里我主要介绍我在项目中用到的递归和尾递归。

二、运用

1、递归常用来处理多层嵌套数据结构,例如树形结构。而线性结构也可以通过不停的递归,最终变成一个树形结构,但是一般情况下,尽量不要使用递归,因为递归非常消耗性能。但是有些时候遍历,用递归就会非常的方便,所以为了避免损耗性能,我们可以采用一种称为尾递归的特殊递归。

2、尾递归,如果一个函数中所有的调用都出现在函数的末尾,那么我们就成这个函数尾递归,其特点就是返回值不属于表达式的一部分。

3、项目中的使用,在联调的时候,通常数据会是一个嵌套的数据,我们可以直接拿来用,但要是我们需要对树形结构的数据的某一项进行处理的话,这个时候就会变得非常的麻烦。所以我们需要跟后端约定,让其返回给我们的数据是一个线性的数据,若是处理线性一维数据,是不是就非常方便了。等我们将数据处理完后,再将其通过递归变成树形结构。

三、代码

1、自定义渲染孩子树,可以在节点那边添加编辑按钮

const renderTreeNodes = (list) => {
    if (!Array.isArray(list)) return [];
    return list.map((o, i) => {
      return (
        <Tree.TreeNode
          name={o.title}
          title={o.title}
          key={o.key}
        >
          {o.children && renderTreeNodes(o.children)}
        </Tree.TreeNode>
      );
    });
  };
  
  <Tree>{renderTreeNodes(treeData)}</Tree>           

2、渲染数据,此代码不需要对树进行新操作,只需要对数据进行一个处理

const dealFunc = (arr) => {
    arr.forEach((i) => {
      i.value = i.vipCategoryId;
      i.title = i.vipCategoryName;
      if (i.children?.length) {
        i.selectable = false;
        dealFunc(i.children);
      }
    });
    return arr;
  };
  
  <Tree treeData={dealFunc(treedata)}></Tree>           

3、尾递归代码,阶乘函数举例

const facttail=(int n, int res)=>{
    if (n < 0)
        return 0;
    else if(n == 0)
        return 1;
    else if(n == 1)
        return res;
    else
        return facttail(n - 1, n *res);
}
           

继续阅读