数据结构:递归:自然数之和
目录
递归解法
🔹第一步:定义本质问题
🔹第二步:分解问题结构
🔹第三步:定义初始条件
🔹第四步:递归思想的自然生成
循环解法
🔹第 1 步:定义问题最小操作单位
🔹第 2 步:识别模式:操作在变化,但结构不变
🔹第 3 步:构造“自我控制的重复流程”
公式解法
复杂度对比分析
我们希望计算:
S(n)=1+2+3+⋯+n
我们运用第一性原理,从最基本的思考出发。
递归解法
🔹第一步:定义本质问题
我们的问题是:如何求“前 n 个自然数”的总和?
这是一个数学过程,它可以表示为:
S(n) = 1 + 2 + 3 + ⋯ + n
我们意识到这个总和的结果,和它前一项的总和非常接近。
例如:
-
S(3) = 1+ 2 + 3 =6
-
S(2) = 1 + 2 = 3
-
差值:3(恰好是第3项)
观察:
S(n) = S(n−1) + n
我们还没用“递归”这个词,但我们已经观察到了:
✅ 当前问题的解,等于一个更小规模的问题的解 + 当前项
🔹第二步:分解问题结构
我们从基本操作开始模拟:
-
S(1)=1(这是我们唯一能确定的“基础真理”)
-
S(2)=S(1)+2=1+2=3
-
S(3)=S(2)+3=3+3=6
-
S(4)=S(3)+4=6+4=10
于是我们归纳出结构性关系:
S(n)=S(n−1)+n
这时候,我们不是为了“递归编程”而发现这个关系,而是:
🔍我们通过“问题拆解”自然得出了一个问题依赖于更小版本的问题的解决结果的事实。
🔹第三步:定义初始条件
任何这种“问题拆解”机制,都需要一个,否则会无限拆解。
从实际观察:
S(1)=1→ 唯一直接能算出的总和
我们就可以从这里出发,逐步构建更大的答案。
🔹第四步:递归思想的自然生成
通过以上分析,我们从第一性原理推导出了:
-
问题的结构性:每个总和是前一个总和加当前项;
-
最基本的事实:我们只知道 S(1)=1
-
由小推大的模式出现了,这就是递归的本质:
#include <iostream>int sumOfNumbers(int n)
{if (n == 0)return 0;elsereturn sumOfNumbers(n - 1) + n;
}
循环解法
🔹第 1 步:定义问题最小操作单位
最原始的求和操作,我们只能用 一个一个加起来 的方式。
例如:要计算 S(3),你只能写:
int s = 0;
s = s + 1;
s = s + 2;
s = s + 3;
你会发现这段代码“重复”了完全相同的结构:
s = s + X;
只是每次 X
变了。
🔹第 2 步:识别模式:操作在变化,但结构不变
❗我们观察到:“结构一致,数值递增”的模式:
-
起始值从 1 到 n;
-
每次执行的指令是类似的;
-
只是某个变量(这里是 X)在以固定规律变化。
从第一性角度我们意识到:
✅ 为了避免重复写代码,我们应该“将重复的操作抽象为一个流程”,并让某些部分变化。
🔹第 3 步:构造“自我控制的重复流程”
我们定义:
-
一个当前项
i
:表示我们正处理第几个数; -
一个结束条件:当我们加到
n
时,停止; -
一个变化规则:每次
i = i + 1
。
于是我们就得到:
int s = 0;
int i = 1; // 初始状态while (i <= n) {s = s + i;i = i + 1; // 状态变化
}
从第一性原理看,“循环”之所以产生,是因为:
-
我们面对的问题具有重复性(相同操作、不同值);
-
人为复制是不经济、脆弱的(写死
s = s + 1 + 2 + ...
会爆炸); -
我们想用一个“变化控制机制”让重复自动发生;
-
这就产生了循环语义:自动控制的重复结构。
公式解法
int sumOfNumbers(int n)
{return n * (n + 1) / 2;
}
复杂度对比分析
方法 | 时间复杂度 | 空间复杂度 | 原因解释 |
---|---|---|---|
✅递归 | O(n) | O(n) | 每次递归都需要函数调用栈,每次计算加法,总共调用 nn 次 |
✅循环 | O(n) | O(1) | 只需一个累加器和一个循环变量,占用常数空间 |
✅公式 | O(1) | O(1) | 只做一次乘法和一次除法,且不使用任何额外空间 |
⚠️注意事项
-
公式法虽然最快,但若
n
非常大(如2^31 - 1
),n*(n+1)
可能会产生整数溢出。可使用long long
类型或进行乘法前除法优化。 -
递归法在 C++ 中若没有尾递归优化,容易栈溢出;在 Python 中栈深限制也较低。
-
循环法更通用、安全、稳定,适用于大多数工程需求。
相关文章:

数据结构:递归:自然数之和
目录 递归解法 🔹第一步:定义本质问题 🔹第二步:分解问题结构 🔹第三步:定义初始条件 🔹第四步:递归思想的自然生成 循环解法 🔹第 1 步:定义问题最小…...

网易 - 灵犀办公文档
一. 企业介绍 网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,通过开设新闻、娱乐、体育等30多个内容频道,以及博客、视频、论坛等互动交流,网聚人的力量。 为了给中小企业和个人打造一款综合性办公产…...

【C++】模板与特化技术全面教程(claude sonnet 4)
第一章:模板的基础概念 (Template Fundamentals) 1.1 什么是模板? 模板 (Template) 是C中的一种泛型编程 (Generic Programming) 机制,它允许我们编写与类型无关的代码。想象一下,如果我们要为不同的数据类型编写相同逻辑的函数&a…...

ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”
“高内聚、低耦合”是面向对象编程中非常重要的设计原则,它有助于提高代码的可维护性、扩展性和复用性。 1. 初衷:为什么会有这个原则? 在软件开发中,随着业务需求的复杂化,代码难免会变得越来越庞大。如果开发者将一…...

RagFlow优化代码解析(一)
引子 前文写到RagFlow的环境搭建&推理测试,感兴趣的童鞋可以移步(RagFlow环境搭建&推理测试-CSDN博客)。前文也写过RagFLow参数配置&测试的文档,详见()。很少写关于具体代码的blog,…...

【python与生活】用 Python 从视频中提取音轨:一个实用脚本的开发与应用
在当今数字化的时代,视频内容无处不在。无论是学习教程、会议记录、在线讲座还是娱乐视频,我们每天都会接触到大量的视频资源。有时候,我们可能只对视频中的音频部分感兴趣,比如提取讲座的音频用于后续收听,或者从电影…...

深度强化学习赋能城市消防优化,中科院团队提出DRL新方法破解设施配置难题
在城市建设与发展中,地理空间优化至关重要。从工业园区选址,到公共服务设施布局,它都发挥着关键作用。但传统求解方法存在诸多局限,如今,深度学习技术为其带来了新的转机。 近日,在中国地理学会地理模型与…...
云原生周刊:探索 Gateway API v1.3.0
开源项目推荐 WatchAlert WatchAlert 是一个轻量级、云原生的多数据源监控告警引擎,支持 AI 驱动的智能告警分析,旨在帮助升级您的监控系统架构。该项目基于 Go 和 React 开发,提供了现代化的前后端架构。后端使用 Go 语言,结合…...

008房屋租赁系统技术揭秘:构建智能租赁服务生态
房屋租赁系统技术揭秘:构建智能租赁服务生态 在房地产租赁市场日益活跃的当下,房屋租赁系统成为连接房东与租客的重要数字化桥梁。该系统集成用户管理、房屋信息等多个核心模块,面向管理员、房东和用户三类角色,通过前台展示与后…...
Python训练打卡Day41
简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 → Batch…...

spring-boot-admin实现对微服务监控
spring-boot-admin可以对微服务的状态进行监控,步骤如下: 1、添加spring-boot-admin和nacos依赖 <!-- nacos注册中心 --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-n…...
Linux 权限管理入门:从基础到实践
文章目录 引言一、Linux 权限管理概述二、文件权限值的表示方法三、文件访问权限的设置(chmod)四、file指令:快速识别文件类型五、目录的权限六、普通文件的权限七、权限总结八、粘滞位 引言 在 Linux 系统中,权限管理是确保多用…...

Mycat的监控
参考资料: 参考视频 参考博客 Mysql分库分表(基于Mycat)的基本部署 MySQL垂直分库(基于MyCat) Mysql水平分表(基于Mycat)及常用分片规则 视频参考资料及安装包: https://pan.b…...

Glide源码解析
前言 Glide是一款专为Android设计的开源图片加载库。有以下特点:1.支持高效加载网络、本地及资源图片;2.具备良好的缓存策略及生命周期管理策略;3.提供了简易的API和强大的功能。本文将对其源码进行剖析。 基本使用 dependencies {compile …...

7.RV1126-OPENCV cvtColor 和 putText
一.cvtColor 1.作用 cvtColor 是 OPENCV 里面颜色转换的转换函数。能够实现 RGB 图像转换成灰度图、灰度图转换成 RGB 图像、RGB 转换成 HSV 等等 2.API CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn 0 ); 第一个参数:…...
Android 之 kotlin 语言学习笔记二(编码样式)
参考官方文档:https://developer.android.google.cn/kotlin/style-guide?hlzh-cn#whitespace 1、源文件命名 所有源文件都必须编码为 UTF-8。如果源文件只包含一个顶级类,则文件名应为该类的名称(区分大小写)加上 .kt 扩展名。…...

Redisson单机模式
redisson调用unlock的过程 Redisson 是一个基于 Redis 的 Java 驻内存数据网格(In-Memory Data Grid)框架,提供了分布式和可扩展的数据结构和服务。Redisson 的 unlock 方法用于释放锁。下面是 unlock 方法的调用过程: 获取锁的状…...

数据结构第6章 图(竟成)
第 6 章 图 【考纲内容】 1.图的基本概念 2.图的存储及基本操作:(1) 邻接矩阵法;(2) 邻接表法;(3) 邻接多重表、十字链表 3.图的遍历:(1) 深度优先搜索;(2) 广度优先搜索 4.图的基本应用:(1) 最小 (代价) 生…...

机器人现可完全破解验证码:未来安全技术何去何从?
引言 随着计算机视觉技术的飞速发展,机器学习模型现已能够100%可靠地解决Google的视觉reCAPTCHAv2验证码。这标志着一个时代的结束——自2000年代初以来,CAPTCHA("全自动区分计算机与人类的图灵测试"的缩写)一直是区分…...

CppCon 2014 学习:(Costless)Software Abstractions for Parallel Architectures
硬件和科学计算的演变关系: 几十年来的硬件进步:计算机硬件不断快速发展,从提升单核速度,到多核并行。科学计算的驱动力:科学计算需求推动硬件创新,比如需要更多计算能力、更高性能。当前的解决方案是并行…...

网络爬虫 - App爬虫及代理的使用(十一)
App爬虫及代理的使用 一、App抓包1. App爬虫原理2. reqable的安装与配置1. reqable安装教程2. reqable的配置3. 模拟器的安装与配置1. 夜神模拟器的安装2. 夜神模拟器的配置4. 内联调试及注意事项1. 软件启动顺序2. 开启抓包功能3. reqable面板功能4. 夜神模拟器设置项5. 注意事…...
Kafka集群部署(docker容器方式)SASL认证(zookeeper)
一、服务器环境 序号 部署版本 版本 1 操作系统 CentOS Linux release 7.9.2009 (Core) 2 docker Docker version 20.10.6 3 docker-compose docker-compose version 1.28.2 二、服务规划 序号 服务 名称 端口 1 zookeeper zookeeper 2181,2888,3888 2 ka…...
【python爬虫】利用代理IP爬取filckr网站数据
亮数据官网链接:亮数据官网...

群晖 NAS 如何帮助培训学校解决文件管理难题
在现代教育环境中,数据管理和协同办公的效率直接影响到教学质量和工作流畅性。某培训学校通过引入群晖 NAS,显著提升了部门的协同办公效率。借助群晖的在线协作、自动备份和快照功能,该校不仅解决了数据散乱和丢失的问题,还大幅节…...

NLP学习路线图(十八):Word2Vec (CBOW Skip-gram)
自然语言处理(NLP)的核心挑战在于让机器“理解”人类语言。传统方法依赖独热编码(One-hot Encoding) 表示单词,但它存在严重缺陷:每个单词被视为孤立的符号,无法捕捉词义关联(如“国…...
P1438 无聊的数列/P1253 扶苏的问题
因为这两天在写线性代数的作业,没怎么写题…… P1438 无聊的数列 题目背景 无聊的 YYB 总喜欢搞出一些正常人无法搞出的东西。有一天,无聊的 YYB 想出了一道无聊的题:无聊的数列。。。 题目描述 维护一个数列 ai,支持两种操…...

嵌入式学习笔记 - 新版Keil软件模拟时钟Xtal灰色不可更改的问题
在新版Keil软件中,模拟时钟无法修改XTAL频率,默认只能使用12MHz时钟。这是因为Keil MDK从5.36版本开始,参数配置界面不再支持修改系统XTAL频率,XTAL选项变为灰色,无法修改。这会导致在软件仿真时出现时间错误的问题&…...
k8s的出现解决了java并发编程胡问题了
Kubernetes(K8s)作为一种开源的容器编排平台,极大地简化了应用程序的部署、管理和扩展。这不仅解决了很多基础设施方面的问题,也间接解决了Java并发编程中的一些复杂问题。本文将详细探讨Kubernetes是如何帮助解决Java并发编程中的…...
如何利用大语言模型生成特定格式文风的报告类文章
在这个算法渗透万物的时代,我们不再仅仅满足于大语言模型(LLM)能“写”,更追求它能“写出精髓,写出风格”。尤其在专业且高度格式化的报告类文章领域,仅仅是内容正确已远远不够,文风的精准复刻才是决定报告是否“对味儿”、能否被目标受众有效接受的关键。这不再是简单的…...

黑马Java面试笔记之 集合篇(算法复杂度+ArrayList+)
一. 算法复杂度分析 1.1 时间复杂度 时间复杂度分析:来评估代码的执行耗时的 常见的复杂度表示形式 常见复杂度 1.2 空间复杂度 空间复杂度全称是渐进空间复杂度,表示算法占用的额外存储空间与数据规模之间的增长关系 二. 数组 数组(Array&a…...