遞迴 尾遞迴

2021-09-24 10:48:28 字數 1340 閱讀 9891

計算n的階乘

function add(n)

return n*function add(n-1)

}斐波那契數列 1 1 2 3 5 8 13...

function arr(n)

else

}

如上例項,但是遞迴有乙個很大的問題,就是在不斷地呼叫自身函式時,每一次呼叫都會存新的資料變數等,如果有成百上千次呼叫,則會占用特別特別特別多記憶體,就有可能會導致棧溢位,就是棧存不下了!!!

但是 在es6中,有乙個明確的概念就是尾呼叫!!!尾呼叫!!!尾呼叫!!!(重要的事情說三遍)可以完美的解決這個問題

尾呼叫:就是在函式最後一次執行時,呼叫乙個函式。

等等,是不是看起來感覺和遞迴沒啥區別啊,不都是最後呼叫乙個函式嘛,只不過遞迴是呼叫自己,實則不然嘻嘻。

尾呼叫要求最後一步僅僅只呼叫這個函式,別的什麼都不能幹 不然就不叫尾呼叫!

function fn()  //=>這叫尾呼叫

function fn()//=>這就不是尾呼叫了

通過上面兩個例子可以看出,最後一步除了呼叫這個函式意外什麼也不允許做,否則就不是尾呼叫,為什麼是這樣呢,因為在這種情況下,最後只呼叫乙個函式,則整個大函式中,就不用儲存外層函式的呼叫記錄,也就是說外層函式的變數等都不需要儲存了,記憶體就被釋放了。

在遞迴中,使用尾呼叫方法解決棧溢位問題。

在普通的遞迴中,n的階乘因為要呼叫n次函式,空間複雜度為o(n);而在尾遞迴中:

function add(n,all)

return add(n-1,n*all)

}add(3,1)

//n===3,all===1,return add(2,3);

//n===2,all===3,return add(1,6);

//n===1,all===6,return 6

斐波那契數列 尾遞迴實現

function fecth(n,x=1,y=1)

return fecth(n-1,y,x+y)

}console.log(fecth(100))//=>9.332621544394415e+155

原始遞迴

function arr(n)

else

}console.log(arr(100))//=>uncaught rangeerror: maximum call stack size exceeded

遞迴 尾遞迴

階乘函式 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...

遞迴與尾遞迴

1 遞迴 關於遞迴的概念,我們都不陌生。簡單的來說遞迴就是乙個函式直接或間接地呼叫自身,是為直接或間接遞迴。一般來說,遞迴需要有邊界條件 遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進 當邊界條件滿足時,遞迴返回。用遞迴需要注意以下兩點 1 遞迴就是在過程或函式裡呼叫自身。2 在使用遞迴策略時...

遞迴與尾遞迴

1 遞迴 簡單的來說遞迴就是乙個函式直接或間接地呼叫自身,是為直接或間接遞迴。一般來說,遞迴需要有邊界條件 遞迴前進段和遞迴返回段。當邊界條件不滿足時,遞迴前進 當邊界條件滿足時,遞迴返回。用遞迴需要注意以下兩點 1 遞迴就是在過程或函式裡呼叫自身。2 在使用遞迴策略時,必須有乙個明確的遞迴結束條件...