函式的尾遞迴

2022-09-18 01:48:35 字數 903 閱讀 8161

1. 是什麼?

函式末尾只呼叫自身稱為尾遞迴。

2. 為什麼?

遞迴函式在呼叫時會在記憶體中儲存呼叫位置內部變數資訊,形成乙個呼叫棧。如果不加優化,有可能同時儲存成百上千個呼叫記錄。很容易發生棧溢位的錯誤。

尾呼叫函式由於是函式的最後一步操作,所以不需要保留外層函式的呼叫記錄,因為呼叫位置和內部變數資訊都不需要再用到了,只要直接用記憶體的呼叫記錄取代外層的呼叫記錄就可以了。所以不會發生棧溢位的錯誤。

3. 怎麼辦?

實現尾遞迴只需要我們在原來的函式基礎上追加乙個引數用來儲存遞迴迴圈的值。當然這樣會大大增加函式的有雅興。所以優化方式可以有:

另外增加乙個正常的函式

function tailfactorial(n, total) 

function factorial(n)

factorial(5)// 120

使用函式currying的思想

function currying(fn, n) ;

}function tailfactorial(n, total)

const factorial = currying(tailfactorial, 1);

factorial(5)// 120

使用es6提供的預設值

function factorial(n, total = 1) 

factorial(5)// 120

遞迴函式及尾遞迴

自己呼叫自己的函式,一去一回就是遞迴函式 示例一 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 ...

js尾遞迴函式

普通遞迴 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 上述用普通遞迴實現的階乘的執行過程中,不斷的呼叫自身,導致一直沒有返...

遞迴函式 頭遞迴和尾遞迴

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