什么是递归函数_如何在javascript中编写

发布时间 - 2026-01-07 00:00:00    点击率:
递归函数是函数调用自身,必须有明确终止条件(base case),否则导致栈溢出;核心结构为base case加recursive case,常见错误包括缺return、base case条件错误、问题规模未缩小。

递归函数就是函数自己调用自己。在 JavaScript 中能用,但必须有明确的终止条件,否则会无限调用导致 RangeError: Maximum call stack size exceeded

递归函数的核心结构:base case + recursive case

写递归函数时,先想清楚两件事:什么时候停止?(base case);其余情况怎么缩小问题规模并交给自己处理?(recursive case)

  • 没有 base case → 一定会栈溢出
  • base case 条件写错(比如该用 却用了 )→ 可能跳过终止,同样栈溢出
  • recursive case 没让问题变小(比如传入相同的参数)→ 死循环调用

例如计算阶乘:

function factorial(n) {
  if (n < 0) return NaN; // 非法输入防护
  if (n === 0 || n === 1) return 1; // base case
  return n * factorial(n - 1); // recursive case:规模减 1
}

常见错误:忘记 return 或返回值未传递

JavaScript 中如果函数体末尾没写 return,默认返回 undefined。递归里漏掉 return,会导致上层拿到 undefined,后续计算崩掉。

立即学习“Java免费学习笔记(深入)”;

  • 错例:factorial(3)return n * factorial(n - 1) 写成 n * factorial(n - 1)(无 return)→ 返回 undefined
  • 嵌套调用时,每一层都必须把结果显式 return 出去
  • 调试技巧:在函数开头加 console.log('factorial called with', n),看是否卡住或重复进入

替代方案:什么时候不该用递归?

JavaScript 引擎不普遍支持尾调用优化(TCO),所以深度递归容易爆栈。简单循环能解决的问题,优先用 forwhile

  • 斐波那契数列用朴素递归(fib(n) = fib(n-1) + fib(n-2))时间复杂度是 O(2^n),实际项目中要避免
  • 遍历 DOM 树、解析嵌套 JSON、走文件系统目录这类天然分层结构,递归更直观且合理
  • 若必须深递归,可改用迭代 + 显式栈(Array 模拟),或设最大深度保护(如加参数 depth 并在 base case 中检查)

递归不是炫技,是为匹配问题本身的结构。写之前先画两层调用链,确认 base case 能被触达,再动手。否则修 bug 的时间远超写代码的时间。


# javascript  # java  # js  # json  #   # 递归函数 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用模型观察者?(Observer代码示例)  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  php结合redis实现高并发下的抢购、秒杀功能的实例  济南网站建设制作公司,室内设计网站一般都有哪些功能?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何安全更换建站之星模板并保留数据?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  什么是javascript作用域_全局和局部作用域有什么区别?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  phpredis提高消息队列的实时性方法(推荐)  详解Oracle修改字段类型方法总结  简历在线制作网站免费版,如何创建个人简历?  网站制作免费,什么网站能看正片电影?  如何在云主机上快速搭建多站点网站?  如何在万网自助建站中设置域名及备案?  Firefox Developer Edition开发者版本入口  如何在IIS中新建站点并解决端口绑定冲突?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  如何获取免费开源的自助建站系统源码?  制作公司内部网站有哪些,内网如何建网站?  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  Windows Hello人脸识别突然无法使用  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  Laravel安装步骤详细教程_Laravel环境搭建指南  Java解压缩zip - 解压缩多个文件或文件夹实例  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel PHP版本要求一览_Laravel各版本环境要求对照  使用Dockerfile构建java web环境  如何快速建站并高效导出源代码?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何用wdcp快速搭建高效网站?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  如何在万网主机上快速搭建网站?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何快速搭建个人网站并优化SEO?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  如何为不同团队 ID 动态生成多个独立按钮  如何快速搭建高效可靠的建站解决方案?  如何在万网自助建站平台快速创建网站?  Laravel如何实现模型的全局作用域?(Global Scope示例)  高防服务器:AI智能防御DDoS攻击与数据安全保障  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项