天天看點

淺析遞歸在項目中的運用

一、介紹

​ 遞歸顧名思義,就是一個函數直接或間接的調用自身,并在滿足邊界條件後,結束函數。這裡我主要介紹我在項目中用到的遞歸和尾遞歸。

二、運用

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);
}
           

繼續閱讀