一、介绍
递归顾名思义,就是一个函数直接或间接的调用自身,并在满足边界条件后,结束函数。这里我主要介绍我在项目中用到的递归和尾递归。
二、运用
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);
}