遞迴在我們平時擼碼中會經常用到,不過可能很多人不知道遞迴的弊端,就是會導致呼叫棧越來越深。如果沒有節制的使用遞迴可能會導致呼叫棧溢位。
function test (i)
// 這個會呼叫自身11次
test(10)
圖1:
圖2:
那怎麼對遞迴進行優化呢,既能起到遞迴的作用又不會加深呼叫棧
這裡會用到while迴圈的思想,呼叫棧之所以會加深主要是因為方法內呼叫方法,必須等待方法執行完成這個任務才算是真正的結束,就像a同學有個任務1,這個任務是讓b同學完成任務2,在b同學沒有完成之前,a同學一直處理工作狀態。
那while迴圈是什麼原理呢,可以理解為將有呼叫關係的方法平鋪為同一級別。這需要引入額外的方法來做排程,本來test方法需要呼叫自己10次的,現在用方法b通過標記的方法來決定是否需要呼叫test方法
利用閉包將f方法保留(這裡的f方法就是我們需要遞迴呼叫的方法)
建立value、active、accumulated三個變數,並利用了閉包原理避免被垃圾**
accumulated是儲存每次f方法呼叫後需要傳入f的新的形參,active是標記f方法是否執行到了最後一次迴圈,value是記錄需要返回的值
function tco(f)
active = false;
return value;}};
}var sum = tco(function(x, y)
else
});sum(1, 100000)
這裡可能會有點難理解,可以多試幾次,打斷點看看控制台的呼叫棧。相信還是可以看出其中的原理 js快排尾遞迴優化
尾遞迴是個什麼東西這邊就不介紹了。總之遞迴我是一直沒有搞明白。但是我知道尾遞迴是為了解決遞迴造成的棧溢位和大量重複的計算。function quicksort arr,left,right 交換基準和i arr left arr i arr i flag 對左邊快排 quicksort arr,le...
遞迴 遞迴的優化
遞迴演算法在工作或者各種資料結構中使用比較頻繁,遞迴演算法的簡化常見有自頂向下還有備忘錄法 自頂向下 t n t1 n t2 n t3 n 25c t1 n r11p1 r12p2 r13p3 r14p4 r15p5 r16p6 r17p7 r18p8 r19p9 t1 n 1 x tau1 t1 ...
Js中通過記憶來優化遞迴方法
函式可以通過用物件去記住先前操作的結果,從而避免無謂的運算,這種優化稱為 記憶 memoization 1 求數字之和基本遞迴方法 其中fibonacci為一般常用的遞迴方法,能滿足基本要求,但存在重複呼叫的現象 var count 0 記錄遍歷次數 var fibonacci function n...