递归:从求和问题到数组扁平化,彻底搞懂递归思维
文章目录前言一、如何求 123…n 的和1.1 迭代解法1.2 自顶向下递归思维二、递归三要素重点三、调用栈机制 栈溢出风险3.1 压栈与出栈3.2 栈溢出四、数组扁平化递归实战4.1 原生 flat() 回顾4.2 递归手写基础版4.3 升级版支持深度控制五、性能优化 避坑5.1 concat 的性能问题六、全文总结七、核心知识点复盘八、常见问题 避坑指南前言递归用「自己调用自己」将复杂问题拆为规模更小的同类子问题代码比迭代更简洁、更贴近问题本质。本文从「求 12…n 的和」切入深入到「数组扁平化」的工程实战覆盖递归三要素、调用栈机制、尾调用优化、多方案实现及面试避坑。一、如何求 123…n 的和1.1 迭代解法functionsum(n){lettotal0;for(leti1;in;i)totali;returntotal;}迭代靠循环变量逐个累加直观但没揭示问题的结构。1.2 自顶向下递归思维换一个角度思考——大问题和小问题之间的关系sum(5) sum(4) 5 sum(4) sum(3) 4 sum(3) sum(2) 3 sum(2) sum(1) 2 sum(1) 1 ← 终止画成树状结构就是自顶向下展开、自底向上回归sum(5) / \ sum(4) 5 / \ sum(3) 4 / \ sum(2) 3 / \ sum(1)2 | 1核心洞察sum(n)sum(n-1)n一直拆到sum(1)1这个「原子问题」为止。二、递归三要素重点任何一个正确的递归函数必须同时满足三个要素要素含义本例① 递归公式大问题如何由小问题构成f(n) f(n-1) n② 退出条件递归终止的 Base Casef(1) 1③ 子问题结构一致每次递归问题类型不变只缩小规模sum(n-1)和sum(n)同构代码实现functionsum(n){if(n1)return1;// ② 退出条件returnsum(n-1)n;// ① 递归公式 ③ 子问题结构一致}console.log(sum(100));// 5050忘记写 base case 无限递归 栈溢出面试直接挂。三、调用栈机制 栈溢出风险3.1 压栈与出栈以sum(3)为例压栈拆解 sum(3) 入栈 → sum(2) 入栈 → sum(1) 入栈 → 命中 base case返回 1 出栈回归 sum(1) 返回 1 → sum(2): 123 → sum(3): 336每一层递归保留独立的局部变量调用栈天然提供隔离。3.2 栈溢出JS 引擎调用栈约 1 万层上限sum(100000)直接报错RangeError: Maximum call stack size exceeded递归的空间复杂度 O(n)每一层都占栈内存迭代只用 O(1)。数据量大时优先迭代。四、数组扁平化递归实战4.1 原生flat()回顾constarr[1,[2,[3,4,[5,6]]]];arr.flat();// [1, 2, [3, 4, [5, 6]]] 默认一层arr.flat(2);// [1, 2, 3, 4, [5, 6]] 指定深度arr.flat(Infinity);// [1, 2, 3, 4, 5, 6] 全部拍平4.2 递归手写基础版思路跟求和一致是数组就递归深入不是数组就放入结果。constflatten(arr){letresult[];arr.forEach((item){if(Array.isArray(item)){resultresult.concat(flatten(item));// 递归拍平 拼接}else{result.push(item);// base case}});returnresult;};constarr[1,2,[3,4,[5,6]]];console.log(flatten(arr));// [1, 2, 3, 4, 5, 6]关键步骤Array.isArray(item)是分岔口concat合并子结果push收拢非数组元素。4.3 升级版支持深度控制constflattenDepth(arr,depth1){letresult[];arr.forEach((item){if(Array.isArray(item)depth0){resultresult.concat(flattenDepth(item,depth-1));// depth 递减}else{result.push(item);}});returnresult;};constarr[1,[2,[3,4,[5,6]]]];console.log(flattenDepth(arr,1));// [1, 2, [3, 4, [5, 6]]]console.log(flattenDepth(arr,2));// [1, 2, 3, 4, [5, 6]]console.log(flattenDepth(arr,Infinity));// [1, 2, 3, 4, 5, 6]核心技巧depth 0作为额外退出条件每深入一层depth - 1。Infinity - 1 Infinity所以传Infinity等价全部拍平。五、性能优化 避坑5.1concat的性能问题concat每次创建新数组并全量拷贝嵌套深时开销可观。替代// 方案 A展开运算符result.push(...flatten(item));六、全文总结从「求 1~n 的和」建立递归三要素框架图解调用栈压栈/出栈过程再迁移到「数组扁平化」实战给出基础版、深度控制版、方案及性能分析覆盖递归思维的全链路。七、核心知识点复盘知识点要点递归三要素递归公式 / 退出条件 / 子问题结构一致调用栈压栈拆解 出栈回归每层独立局部变量栈溢出约 1 万层上限大纵深用迭代flat(depth)depth默认 1Infinity全部拍平深度控制depth - 1逐层递减depth 0停止尾调用优化递归是函数最后一步才可复用栈帧V8 未全面支持迭代兜底手动stack数组模拟调用栈突破引擎限制八、常见问题 避坑指南Q1递归和迭代怎么选优先迭代问题具有清晰递归结构树遍历、分治且数据可控时用递归——代码更贴近问题定义。Q2concatvspush(...)哪个好小数据没差别中数据用push(...)减少中间数组大数据用for逐项push避免展开运算符参数上限。Q3递归如何调试第一行打console.log看入参 → 优先检查 base case90% 的 bug 在此→ 小数据验证后再跑真实数据。Q4为什么用Array.isArray而不是instanceof Array跨 iframe / 跨 realm 场景下instanceof会误判Array.isArray永远正确。Q5手写 flat 最容易漏什么忘记depth默认值应为1不是Infinity在原数组上直接splice产生副作用空数组边界处理遗漏。递归不是魔法是将「大问题」映射到「同类小问题」的思维方式。掌握三要素、理解调用栈、知道何时迭代兜底——你就真正掌握了递归的精髓。

相关新闻

高端摄影滤镜品牌推荐:基于实测体验的十大专业之选

高端摄影滤镜品牌推荐:基于实测体验的十大专业之选

作为一名在摄影器材评测领域摸爬滚打多年的测评师,我的工作室里常年堆着各个品牌的滤镜。从风光长曝光到视频创作,从人像柔化到航拍减光,一块好滤镜对最终成片的影响,远比很多新手想象的要大。今天我不打算列干巴巴的参数表&#…

2026/6/27 20:01:44阅读更多 →
openEuler社区文档体系解析:从README到治理文档的完整结构

openEuler社区文档体系解析:从README到治理文档的完整结构

openEuler社区文档体系解析:从README到治理文档的完整结构 【免费下载链接】community The Community repo is to store all the information about openEuler Community, inclouding governance, SIGs(project teams), Communications and etc. 项目地址: https:…

2026/6/27 20:01:44阅读更多 →
从媒体政策导向拆解:城市文旅市集如何搭建可持续消费新生态

从媒体政策导向拆解:城市文旅市集如何搭建可持续消费新生态

过去文旅市集多作为节假日配套临时活动,如今政策层面将其定位为城市标配文旅基础设施。文旅市集已经进入长效化、生态化建设新阶段,短期摆摊式临时市集将逐步退出主流赛道。各地文旅项目想要抓住政策发展机遇,不能只聚焦线下场地打造&#xf…

2026/6/27 20:01:44阅读更多 →
SingleTrack_Project (二):开发环境配置、数据集选取与 GitHub 仓库建立

SingleTrack_Project (二):开发环境配置、数据集选取与 GitHub 仓库建立

一、引言 在上一篇博客中,我完成了项目任务的拆解和工程目录的搭建。本篇文章我将搭建一个能调用 GPU 加速的开发环境,并为项目准备标准的测试数据,同时将代码托管到 GitHub。二、开发环境配置 本项目涉及 Flask 后端开发和多模块…

2026/6/27 21:27:07阅读更多 →
2026年优选指南:高性价比苦荞快餐粉评测推荐

2026年优选指南:高性价比苦荞快餐粉评测推荐

随着生活节奏的加快,越来越多的人开始寻找既方便又健康的饮食选择。苦荞快餐粉因其独特的营养价值和便捷性,逐渐成为众多消费者的新宠。在众多品牌中,如何挑选出品质优良且性价比高的产品呢?本文将为你介绍一款值得信赖的品牌——…

2026/6/27 21:27:07阅读更多 →
为什么有些家用电梯用了10年很少坏,有些3年就开始频繁故障?

为什么有些家用电梯用了10年很少坏,有些3年就开始频繁故障?

一、一个真实的案例:13万买的电梯,两年故障不断2021年,一位业主花了13.6万元安装了一台家用别墅电梯。2022年10月到2023年6月,短短8个月里,电梯频繁出现系统故障,困人、异响、停止运行等问题反复发生。期间…

2026/6/27 21:27:07阅读更多 →
Spring AI 2.0.0 Prompt 入门教程:system、user、template 和流式输出 Demo

Spring AI 2.0.0 Prompt 入门教程:system、user、template 和流式输出 Demo

Spring AI 2.0.0 Prompt 入门教程:system、user、template 和流式输出 Demo 很多 Spring AI Demo 一开始都是这样写的: chatClient.prompt().user("你是一个 Java 专家,请帮我解释这段代码,回答要简洁:" co…

2026/6/27 21:27:07阅读更多 →
UE 移动端场景性能热力图实践:如何定位地图低帧区域

UE 移动端场景性能热力图实践:如何定位地图低帧区域

用空间网格做 UE 场景性能热力图:定位“哪里卡”而不是“整体有点卡”摘要:复杂场景的性能通常具有明显空间差异。只沿一条跑图路线采样,容易漏掉转角、视野边缘、特效交汇区和资源密集区。本文介绍一种可自动化的空间网格采样方法&#xff1…

2026/6/27 21:27:07阅读更多 →
OmniStream SQL算子加速实战:从Calc到WindowAgg的完整指南

OmniStream SQL算子加速实战:从Calc到WindowAgg的完整指南

OmniStream SQL算子加速实战:从Calc到WindowAgg的完整指南 【免费下载链接】OmniStream OmniStream operator acceleration is implemented using native code (C/C) to optimize Flink SQL and DataStream operators. 项目地址: https://gitcode.com/openeuler/O…

2026/6/27 21:22:07阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/27 11:20:40阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/27 5:46:02阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/27 11:20:39阅读更多 →
10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声:Retrieval-based-Voice-Conversion-WebUI完整指南

10分钟AI语音克隆与实时变声&#xff1a;Retrieval-based-Voice-Conversion-WebUI完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrie…

2026/6/27 0:04:03阅读更多 →
Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider:3分钟AI智能分层,彻底告别手动抠图时代

Layerdivider&#xff1a;3分钟AI智能分层&#xff0c;彻底告别手动抠图时代 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 还在为复杂的图像分层工作烦…

2026/6/27 0:04:03阅读更多 →
Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

Tomcat中X-Frame-Options配置实战:防御点击劫持的四种方法与最佳实践

1. 项目概述&#xff1a;为什么X-Frame-Options是Web安全的“防盗门”&#xff1f;最近在排查一个老项目的安全审计报告时&#xff0c;又被提到了“点击劫持”风险&#xff0c;矛头直指缺失的X-Frame-Options响应头。这已经不是第一次了&#xff0c;很多开发团队&#xff0c;尤…

2026/6/27 0:04:03阅读更多 →