讲师中心 微信公众号
AI工具推荐 视频效率加速

javascript递归是什么_如何编写一个递归函数?

大涛姑娘_6004

大涛姑娘_6004

发布时间:2026-01-09 17:14:43

|

516人浏览过

|

来源于php中文网

原创

递归函数必须有明确终止条件,每次调用须向该条件收敛,否则栈溢出;需处理边界(如负数)、改变参数、注意JS无尾递归优化及阶乘示例的局限性。

javascript递归是什么_如何编写一个递归函数?

递归函数必须有明确的终止条件

递归不是“函数调自己”就完事,关键在于每次调用都要向终止状态靠近,否则会无限执行直到栈溢出。常见错误是忘记写 return,或终止条件写成 if (n === 0) 却没处理负数输入,导致 n 永远减不到 0。

  • 终止条件通常对应问题的最简子情况(比如数组长度为 0、数字为 1 或 0)
  • 递归调用必须改变至少一个参数值,且该变化要朝终止条件收敛
  • JavaScript 默认没有尾递归优化(TCO),深度过大(一般 >10000 层)必然报错 RangeError: Maximum call stack size exceeded

阶乘函数是最典型的递归入门示例

它直观展示“问题分解 + 终止判断 + 自调用”的三要素,但要注意它不处理非正整数输入,实际使用需加固。

function factorial(n) {
  if (n < 0 || !Number.isInteger(n)) {
    throw new Error('n must be a non-negative integer');
  }
  if (n === 0 || n === 1) {
    return 1;
  }
  return n * factorial(n - 1);
}
  • factorial(5) 展开为 5 * factorial(4) → 5 * 4 * factorial(3) → … → 5 * 4 * 3 * 2 * 1
  • 每层调用都压入调用栈,返回时逐层计算乘积
  • 若传入 factorial(-1),n - 1 会越来越小,永远无法触发 n === 0,最终栈溢出

遍历嵌套对象或数组时递归比循环更自然

当结构深度不确定(如菜单树、JSON Schema、DOM 子节点),递归能避免手动维护栈或队列,逻辑更贴近数据本身。

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载
function deepFind(obj, key) {
  if (obj === null || typeof obj !== 'object') return undefined;
  if (key in obj) return obj[key];
  for (const val of Object.values(obj)) {
    const result = deepFind(val, key);
    if (result !== undefined) return result;
  }
  return undefined;
}
  • 这个函数会进入任意层级的嵌套对象或数组(因为 Object.values() 对数组也返回元素值)
  • 没有显式计数器或索引变量,靠函数自身调用推进遍历
  • 注意:若对象存在循环引用(比如 a.b = a),此函数会无限递归,生产环境需用 WeakMap 记录已访问对象

递归 vs 迭代:性能和可读性常要权衡

递归代码简洁、符合人类对“分而治之”的直觉,但每次调用都有栈帧开销;迭代虽略冗长,却可控、无栈溢出风险。

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

  • 简单线性问题(如斐波那契、阶乘)用迭代更稳妥:for 循环无调用开销,空间复杂度 O(1)
  • 树形/图状结构(如文件系统遍历、AST 处理)递归更易写对,强行转迭代需手动模拟栈,反而易错
  • 想用递归又怕栈溢出?可改用“递归 + 异步分片”,比如用 setTimeout 或 queueMicrotask 把深层调用拆到多个任务中

真正难的不是写出第一个递归函数,而是判断某个问题是否适合递归、何时该收手改用迭代、以及怎么防住循环引用和非法输入——这些地方不加检查,上线后出问题往往悄无声息。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2275

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3722

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1236

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

4299

2025.09.10

python如何计算数的阶乘
python如何计算数的阶乘

方法:1、使用循环;2、使用递归;3、使用math模块;4、使用reduce函数。更多详细python如何计算数的阶乘的内容,可以阅读下面的文章。

525

2023.11.13

python求阶乘教程大全
python求阶乘教程大全

本专题整合了python求阶乘相关教程,阅读专题下面的文章了解更多详细内容。

260

2025.11.08

python语言求阶乘
python语言求阶乘

本专题整合了python中阶乘相关教程,阅读专题下面的文章了解更多详细步骤。

427

2025.12.06

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6747

2023.07.18

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.5万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn