js尾遞迴函式

2022-04-06 10:32:45 字數 791 閱讀 1442

普通遞迴:

function fac(n) 

fac(5) // 120

這是個階乘。但是占用記憶體,因為:

fac(5)

(5*fac(4))

(5*(4*fac(3)))

(5*(4*(3*fac(2))))

(5*(4*(3*(2*fac(1)))))

(5*(4*(3*2)))

(5*(4*(6)))

(5*24)

上述用普通遞迴實現的階乘的執行過程中,不斷的呼叫自身,導致一直沒有返回,這樣也就不斷的在棧中儲存呼叫記錄

而當呼叫自身的次數過多後,就會產生我們常說的「棧溢位」

擬人描述: 就想乙個人不斷地借錢(呼叫自身,不斷向棧中存呼叫記錄),但是總想著以後再還(一直沒有返回),

當外債積累到超出自己償還能力的時候,就跑路了(棧溢位)

尾遞迴

function fac(n, total) 

fac(5, 1) // 120

執行過程如下:

fac(5,1)

fac(4,5)

fac(3,20)

fac(2,60)

fac(1,120)

說明:永遠只有乙個呼叫記錄,呼叫函式產生乙個呼叫記錄,最後一步操作 return fac(n - 1, n * total) 

把當前函式的計算結果當做引數傳遞給了下乙個自身呼叫,這樣第乙個函式呼叫產生的呼叫記錄就消失了,因為它執行完了

依次類推,就不會溢位

尾遞迴:函式的最後一步是執行乙個函式

遞迴函式及尾遞迴

自己呼叫自己的函式,一去一回就是遞迴函式 示例一 def digui n print n,1 if n 0 digui n 1 print n,2 digui 5 示例二 階乘 num 1 def func n global num if n 0 func n 1 num n return num ...

函式的尾遞迴

1.是什麼?函式末尾只呼叫自身稱為尾遞迴。2.為什麼?遞迴函式在呼叫時會在記憶體中儲存呼叫位置和內部變數資訊,形成乙個呼叫棧。如果不加優化,有可能同時儲存成百上千個呼叫記錄。很容易發生棧溢位的錯誤。尾呼叫函式由於是函式的最後一步操作,所以不需要保留外層函式的呼叫記錄,因為呼叫位置和內部變數資訊都不需...

遞迴函式 頭遞迴和尾遞迴

學習總結自 像程式設計師一樣思考 v.anton spraul 著,徐波 譯 遞迴,也就是乙個函式直接或間接呼叫自身。一般來說,遞迴可以分為直接遞迴和間接遞迴。直接遞迴,是指函式自己呼叫自己的情況,而間接遞迴,是指呼叫其他函式時,在其他函式中又呼叫了自己的情況。現在,主要將遞迴分為頭遞迴和尾遞迴來學...