遞歸優化

普通遞歸時,內存需要記錄調用的堆棧所出的深度和位置信息。在最底層計算返回值,再根據記錄的信息,跳回上一層計算,再跳回更高一層,依次運行,直到最外層的調用函數。在cpu計算和內存會消耗很多,而且當深度過大時,會出現堆棧溢出。

eg:

function sum(n){
  if(n===1)return 1;
  return n+sum(n-1);
}

然而,尾遞歸優化卻將結果進行了緩存,整個計算過程是線性的,調用依次sum(x,total)後,會進入下一個棧,相關的數據信息和 跟隨進入,不再放在堆棧上保存。當計算玩最後的值之後,直接返回到最上層的sum(5,0),這能有效的防止堆棧溢出。在 es6之後,我們將迎來尾遞歸優化,通過尾遞歸優化,js在解釋成機器碼的時候,將會向while看齊,也就是說,同時擁有數學表達能力和while的效能。

eg:

function sum(x, total) {

    if(x===1){
        return x+total;
    }
    return sum(x-1, x+total);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章