【譯】一分鐘瞭解遞歸

翻譯:Da
原文地址:dev.to/glitter45/r…編程

不少人在不知不覺中使用了遞歸卻不清楚啥是遞歸,下面的文章用通俗的語言解釋了什麼是遞歸,以及如何使用它。數組

什麼是遞歸

用通俗的語言解釋就是:當咱們須要重複執行相同的任務時,咱們能夠稱其爲遞歸任務。再用編程術語解釋就是:當函數調用函數自己來執行任務,而且會重複執行時,咱們稱之爲遞歸。markdown

還沒聽懂?函數

好吧,咱們來個栗子:oop

function findCorrectObject(arr, id) {
   if(arr[arr.length].id === id) {
     return arr[arr.legth];
   } else if(arr.length === 0) {
     return "Not found!";
   } else {
     arr.pop();
     findCorrectObject(arr, id);
   }
}
findCorrectObject([{id: "3434343", title: "title 1"}, {id: "45454565", title: "title 2"}], "3434343");
複製代碼

在這個例子中,咱們要從數組中找到id爲"3434343"的元素,如上,咱們用所需的參數調用了相同的函數findCorrectObject,這就是遞歸,它會一直執行直到找到對應的對象,或者數組變空返回"not found"。spa

很簡單吧!翻譯

在什麼場景下須要使用遞歸呢

在js中,遞歸大有用處,在不少情景中咱們均可以使用遞歸哦。好比:JSON.parse/JSON.stringify指針

若是你看過lodash裏_deep()的源碼,它就用到了遞歸。你們都知道,_deep()是用來深拷貝的,在js中,咱們若是簡單的將對象賦值給一個新變量,只是將對象的指針賦值給了變量,若是咱們在新變量中修改了對象,那麼已存在的變量也會改變,這就是淺拷貝。而遞歸就能夠解決這一問題,實現深拷貝。(你們有興趣的能夠去loadsh中看源碼,這裏就很少作解釋了,畢竟是一分鐘瞭解遞歸嘛)code

再舉個栗子

下面我再舉個很是著名的栗子來跟你們解釋遞歸:orm

function calculateFactorial(num) {
  if(num === 1) return 1;
  return num * calculateFactorial(num - 1);
}

calculateFactorial(5);
複製代碼

在這個函數中,calculateFactorial會被執行5次。每當calculateFactorial(num - 1)被執行時,它都會建立單獨的函數堆棧,而且上一個函數會等待,直到當前函數解析完成。重複以上,新函數會繼續被調用,直到返回 1;

在最近個人項目開發過程當中,就用到了遞歸(我使用的是React)。當時是咱們遇到一個問題:用戶須要在下拉框中爲家長選擇他們的孩子,可是他們的孩子,也可能有本身的孩子,這樣數據就會增加。我在裏面使用了大量的遞歸,由於每一個對象均可能會有另外一組對象,我須要不停深刻,直到沒有對象中沒有小孩的數據。像這樣的狀況,就可使用遞歸解決啦。

遞歸能夠解決不少循環沒法解決的問題,並且用遞歸實現,代碼會更整潔易讀哦!

感謝閱讀!歡迎評論交流!

相關文章
相關標籤/搜索