尾遞迴 簡要

2022-08-10 01:48:17 字數 786 閱讀 7701

function  fac(n) 

fac(5);

n有幾次就會呼叫幾次,eg:

fac(5);

fac(5(4)fac(3));

fac(5(4(3fac(2));

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

fac(5(4(3(2)));

fac(5(4(6)));

fac(5*24)

120;

函式呼叫時,每此呼叫一次就會儲存一次記錄,當資料足夠大時就會記憶體溢位.

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

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

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

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

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) 

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

依次類推,就不會溢位.

遞迴 尾遞迴

階乘函式 n n n 1 n 2 3 2 1 針對這樣的表述,直譯成乙個過程 define factorial n if n 1 1 n factorial n 1 如果是factorial 6 其計算行為是 factorial 6 6 factorial 5 6 5 factorial 4 6 5...

遞迴 尾遞迴

計算n的階乘 function add n return n function add n 1 斐波那契數列 1 1 2 3 5 8 13.function arr n else 如上例項,但是遞迴有乙個很大的問題,就是在不斷地呼叫自身函式時,每一次呼叫都會存新的資料變數等,如果有成百上千次呼叫,則...

尾呼叫 尾遞迴

首先什麼是尾呼叫呢?我的理解是在,函式的最後呼叫乙個函式,並不包含該函式的任何變數。如 def f n return g n 複製 這個就是尾呼叫,尾呼叫的乙個好處就是,不用生成呼叫棧,因為假設是個尾呼叫,那麼當我執行到函式末尾的時候,這個函式相關的資訊我都可以不用保留了,因此不會出現棧溢位的問題。...