計算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 在使用遞迴策略時,必須有乙個明確的遞迴結束條件...