当前位置: 首页 > backend >正文

【JavaScript】递归的问题以及优化方法

1. 递归多会导致内存消耗变大

  • 递归的本质:函数调用自己,每次调用会在 调用栈 上压入一帧(栈帧),里面保存:

    • 局部变量
    • 参数
    • 返回地址
    • 执行上下文
  • 当递归层级很多时:

    • 调用栈帧越来越多 → 内存消耗增加
    • 如果层级过深 → 触发 栈溢出(Stack Overflow)

👉 举例:

function factorial(n) {if (n === 1) return 1;return n * factorial(n - 1);
}
factorial(100000); // 🔥 Maximum call stack size exceeded

这里就是因为递归深度太大,每一层都占内存,最后栈爆了。


2. 怎么优化递归?

(1)尾递归优化(Tail Recursion)

  • 原理:如果递归调用是函数的最后一步,可以不需要保留当前栈帧,直接复用(更新参数,而不是创建新的栈帧) → 内存消耗低。
  • ES6 有尾调用优化的提案,但目前大部分 JS 引擎 没实现(在某些语言如 Scala、Haskell 是默认优化)。
// 普通递归
function sum(n) {if (n === 1) return 1;return n + sum(n - 1);
}// 尾递归
function sumTail(n, acc = 0) {if (n === 0) return acc;return sumTail(n - 1, acc + n); // ✅ 最后一步是递归调用
}sumTail(100000, 0); // 理论上不会栈溢出

(2)递归改迭代

  • 思路:用循环 + 栈/队列模拟递归,避免调用栈过深。
// 递归版
function factorial(n) {if (n === 1) return 1;return n * factorial(n - 1);
}// 迭代版
function factorialIter(n) {let res = 1;for (let i = 1; i <= n; i++) {res *= i;}return res;
}

👉 迭代的空间复杂度通常是 O(1),比递归更省内存。


(3)分治 + 记忆化(减少重复递归)

  • 比如 斐波那契数列,递归会大量重复计算,可以用缓存减少递归次数。
function fib(n, memo = {}) {if (n <= 1) return n;if (memo[n]) return memo[n];memo[n] = fib(n - 1, memo) + fib(n - 2, memo);return memo[n];
}

3. 面试总结答法

递归会导致内存消耗变大,是因为每次函数调用都会在调用栈里保存上下文,如果递归层级太深,栈就会溢出。优化方法包括:

  • 使用 尾递归优化(如果语言/引擎支持)。
  • 将递归改写为 迭代,降低空间复杂度。
  • 使用 记忆化缓存,减少重复递归。
http://www.xdnf.cn/news/18965.html

相关文章:

  • 安宝特方案丨安宝特工业AR全链路解决方案
  • Unity游戏打包——iOS打包基础、上传
  • java后端的各种注解
  • Linux 禁止 su 的几种限制手段:从 NoNewPrivileges 到 PAM 配置
  • GitHub 宕机自救指南:确保开发工作不间断
  • 大数据毕业设计选题推荐-基于大数据的存量房网上签约月统计信息可视化分析系统-Hadoop-Spark-数据可视化-BigData
  • 学习嵌入式之驱动——I2C子系统
  • 深度学习篇---VGGNet
  • 一个基于物理信息神经网络(Physics-Informed Neural Network, PINN)的多变量时间序列预测模型MATLAB代码
  • Windows 7-11通用,这工具让电脑提速300%
  • 2025.8.28总结
  • HTTP 范围请求:为什么你的下载可以“断点续传”?
  • Chrome 插件开发实战:从入门到精通
  • vue2使用el-form动态参数展示并非空校验
  • 数据结构青铜到王者第九话---二叉树(2)
  • 自下而上的树形dp
  • 深度学习——卷积神经网络(PyTorch 实现 MNIST 手写数字识别案例)
  • pcl_案例2 叶片与根茎的分离
  • 机器视觉学习-day09-图像矫正
  • Day30 多线程编程 同步与互斥 任务队列调度
  • leetcode_73 矩阵置零
  • 【LLM】Transformer模型中的MoE层详解
  • vue布局
  • 架构设计——云原生与分布式系统架构
  • Android中设置RecyclerView滑动到指定条目位置
  • 搜维尔科技核心产品矩阵涵盖从硬件感知到软件渲染的全产品供应链
  • 万博智云联合华为云共建高度自动化的云容灾基线解决方案
  • 【Python开源环境】Anaconda/Miniconda
  • 【数据结构与算法】(LeetCode)141.环形链表 142.环形链表Ⅱ
  • 重置 Windows Server 2019 管理员账户密码