递归栈溢出的解决方案:蹦床函数

8 阅读1分钟

蹦床函数(Trampoline)

蹦床函数(Trampoline Function) 是一种用于优化递归调用、防止栈溢出的技术。它通过将递归转换为循环,避免调用栈的深度累积。

蹦床原理

  1. 递归函数不再直接进行递归调用,而是返回一个函数(称为thunk)或者一个包含后续计算步骤的对象。
  2. 循环地执行这些返回的函数或处理这些对象,直到得到最终结果。
  3. 每次执行都是在同一层调用栈上进行,不会增加调用栈的深度。

斐波那契

// 1. 蹦床函数
function trampoline(fn) {
  return (...args) => {
    let result = fn(...args);
    while (typeof result === 'function') {
      result = result();
    }
    return result;
  };
}

// 2. 创建蹦床式递归函数
function sumTrampolined(n, total = 0) {
  if (n <= 0) return total;
  return () => sumTrampolined(n - 1, total + n); // 返回函数而非递归
}

// 3. 包装
const safeFactorial = trampoline(sumTrampolined);

console.log(safeFactorial(100000));

性能特点

  • 传统递归:O(n)栈空间
  • 蹦床函数:O(1)栈空间 + O(n)堆空间(存储闭包)

蹦床函数本质上是用堆内存(存储闭包)换取栈空间,从而避免了调用栈溢出的风险。