求 1 到 n 的和,函数调用栈的情况如上图所示
function sum (n) {
if (n === 1) return 1
return n + sum(n - 1)
}
function sumWithTailRecursion (n, prevSum = 0) {
if (n === 1) return prevSum + 1
return sumWithTailRecursion(n - 1, prevSum + n)
}
尾递归函数可以被改写成迭代形式
function sumWithIteration(n) {
let prevSum = 0
while (n >= 1) {
prevSum += n
n--
}
return prevSum
}
通用尾递归转换迭代函数
const trampoline = f => (...args) => {
const result = f(...args)
while (typeof result === 'function') result = result()
return result
}
用蹦床函数改写递归
const sumWithIteration = trampoline(sumWiteRecursion)