一、介紹
遞歸顧名思義,就是一個函數直接或間接的調用自身,并在滿足邊界條件後,結束函數。這裡我主要介紹我在項目中用到的遞歸和尾遞歸。
二、運用
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);
}