// 不尾递归
function f(n) {
if (n === 0 || n === 1) return n
else return f(n - 1) + f(n - 2)
}
// 尾递归,不爆栈
function fTail(n, a = 0, b = 1) {
if (n === 0) return a
return fTail(n - 1, b, a + b)
}
// 递归转循环
function tailCallOptimize(f) {
let value
let active = false
const accumulated = []
return function accumulator() {
accumulated.push(arguments)
if (!active) {
active = true
while (accumulated.length) {
value = f.apply(this, accumulated.shift())
}
active = false
return value
}
}
}
const f = tailCallOptimize(function(n, a = 0, b = 1) {
if (n === 0) return a
return f(n - 1, b, a + b)
})
f(5) // return 5
[参考链接]((https://www.ruanyifeng.com/blog/2015/04/tail-call.html)