数据结构:递归:自然数之和

article/2025/6/13 19:41:06

目录

递归解法

🔹第一步:定义本质问题

🔹第二步:分解问题结构

🔹第三步:定义初始条件

🔹第四步:递归思想的自然生成

循环解法

🔹第 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→ 唯一直接能算出的总和

我们就可以从这里出发,逐步构建更大的答案。

🔹第四步:递归思想的自然生成

通过以上分析,我们从第一性原理推导出了:

  1. 问题的结构性:每个总和是前一个总和加当前项;

  2. 最基本的事实:我们只知道 S(1)=1

  3. 由小推大的模式出现了,这就是递归的本质:

#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; // 状态变化
}

从第一性原理看,“循环”之所以产生,是因为:

  1. 我们面对的问题具有重复性(相同操作、不同值);

  2. 人为复制是不经济、脆弱的(写死 s = s + 1 + 2 + ... 会爆炸);

  3. 我们想用一个“变化控制机制”让重复自动发生;

  4. 这就产生了循环语义:自动控制的重复结构。

公式解法 

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 中栈深限制也较低。

  • 循环法更通用、安全、稳定,适用于大多数工程需求。

 


http://www.hkcw.cn/article/XArCPMnIfu.shtml

相关文章

Pandas 技术解析:从数据结构到应用场景的深度探索

序 我最早用Python做大数据项目时&#xff0c;接触最早的就是Pandas了。觉得对于IT技术人员而言&#xff0c;它是可以属于多场景的存在&#xff0c;因为它的本身就是数据驱动的技术生态中&#xff0c;对于软件工程师而言&#xff0c;它是快速构建数据处理管道的基石&#xff1…

CRM管理软件的数据可视化功能使用技巧:让数据驱动决策

在当今数据驱动的商业环境中&#xff0c;CRM管理系统的数据可视化功能已成为企业优化客户管理、提升销售效率的核心工具。据企销客研究显示&#xff0c;具备优秀可视化能力的CRM系统&#xff0c;用户决策效率可提升47%。本文将深入解析如何通过数据可视化功能最大化CRM管理软件…

数据结构:递归的种类(Types of Recursion)

目录 尾递归&#xff08;Tail Recursion&#xff09; 什么是 Loop&#xff08;循环&#xff09;&#xff1f; 复杂度分析 头递归&#xff08;Head Recursion&#xff09; 树形递归&#xff08;Tree Recursion&#xff09; 线性递归&#xff08;Linear Recursion&#xff09;…

Redis底层数据结构之字典(Dict)

Dict基本结构 Dict我们可以想象成目录&#xff0c;要翻看什么内容&#xff0c;直接通过目录能找到页数&#xff0c;翻过去看。如果没有目录&#xff0c;我们需要一页一页往后翻&#xff0c;这样时间复杂度就与遍历的O(n)一样了&#xff0c;而用了Dict我们就可以在O(1)的时间复杂…

高通SoC阵列服务器

高通SoC阵列服务器是基于高通系统级芯片&#xff08;SoC&#xff09;构建的高密度计算解决方案&#xff0c;核心特点为低功耗、高算力集成与模块化设计&#xff0c;主要应用于边缘计算和云服务场景。以下是其技术特性和应用方向的综合分析&#xff1a; 一、核心技术特性 架构…

Linux系统下Google浏览器无法使用中文输入的临时解决方案

文章目录 前言方案描述Edge如何兼容 前言 这个AlamaLinux的ibus-libpinyin确实是让人琢磨不透&#xff0c;就只是无法在Chrome浏览器中、Edge浏览器中使用&#xff0c;而在VSCode、Xfce4-Terminal中使用良好。尝试了很多办法都没有效果&#xff0c;最后在Reddit里面找到了相应…

【AI论文】空间多模态大型语言模型(Spatial-MLLM):增强基于视觉的空间智能中多模态大型语言模型(MLLM)的能力

摘要&#xff1a;多模态大语言模型&#xff08;MLLM&#xff09;的最新进展显著提高了2D视觉任务的性能。 然而&#xff0c;提高他们的空间智能仍然是一个挑战。 现有的3D MLLM总是依赖于额外的3D或2.5D数据来加入空间感知&#xff0c;限制了它们在只有2D输入&#xff08;如图像…

黑马Java面试笔记之 微服务篇(业务)

一. 限流 你们项目中有没有做过限流?怎么做的? 为什么要限流呢? 一是并发的确大(突发流量) 二是防止用户恶意刷接口 限流的实现方式: Tomcat:可以设置最大连接数 可以通过maxThreads设置最大Tomcat连接数,实现限流,但是适用于单体架构 Nginx:漏桶算法网关,令牌桶算法自定…

AWS App Mesh实战:构建可观测、安全的微服务通信解决方案

摘要&#xff1a;本文详解如何利用AWS App Mesh统一管理微服务间通信&#xff0c;实现精细化流量控制、端到端可观测性与安全通信&#xff0c;提升云原生应用稳定性。 一、什么是AWS App Mesh&#xff1f; AWS App Mesh 是一种服务网格&#xff08;Service Mesh&#xff09;解…

《云原生安全攻防》-- K8s网络策略:通过NetworkPolicy实现微隔离

默认情况下&#xff0c;K8s集群的网络是没有任何限制的&#xff0c;所有的Pod之间都可以相互访问。这就意味着&#xff0c;一旦攻击者入侵了某个Pod&#xff0c;就能够访问到集群中任意Pod&#xff0c;存在比较大的安全风险。 在本节课程中&#xff0c;我们将详细介绍如何通过N…

吃透 Golang 基础:数据结构之 Map

文章目录 Map概述初始化删除访问不存在的 key 返回 value 的零值遍历 mapmap 自身的零值map 索引时返回的第二个参数使用 map 实现 set Map Hash Map 是无序的 key/value 对集合&#xff0c;其中所有的 key 都是不同的。通过给定的 key 可以在常数时间复杂度内完成检索、更新或…

手机邮箱APP操作

收发电子邮件方式 邮箱可以在网络段登录&#xff0c;也可以在手机端登录。 大学网络服务 收发电子邮件有三种方式&#xff1a; 1、Web方式&#xff1a; 1&#xff09;登录“网络服务”&#xff08;https://its.pku.edu.cn&#xff09;&#xff0c;点页面顶端“邮箱”。 2&…

Spring AI之RAG入门

目录 1. 什么是RAG 2. RAG典型应用场景 3. RAG核心流程 3.1. 检索阶段 3.2. 生成阶段 4. 使用Spring AI实现RAG 4.1. 创建项目 4.2. 配置application.yml 4.3. 安装ElasticSearch和Kibana 4.3.1. 安装并启动ElasticSearch 4.3.2. 验证ElasticSearch是否启动成功 …

Spring AI Alibaba + Nacos 动态 MCP Server 代理方案

作者&#xff1a;刘宏宇&#xff0c;Spring AI Alibaba Contributor 文章概览 Spring AI Alibaba MCP 可基于 Nacos 提供的 MCP server registry 信息&#xff0c;建立一个中间代理层 Java 应用&#xff0c;将 Nacos 中注册的服务信息转换成 MCP 协议的服务器信息&#xff0c…

19-项目部署(Linux)

Linux是一套免费使用和自由传播的操作系统。说到操作系统&#xff0c;大家比较熟知的应该就是Windows和MacOS操作系统&#xff0c;我们今天所学习的Linux也是一款操作系统。 我们作为javaEE开发工程师&#xff0c;将来在企业中开发时会涉及到很多的数据库、中间件等技术&#…

2025.6.3学习日记 Nginx 基本概念 配置 指令 文件

1.初始nginx Nginx&#xff08;发音为 “engine x”&#xff09;是一款高性能的开源 Web 服务器软件&#xff0c;同时也具备反向代理、负载均衡、邮件代理等功能。它由俄罗斯工程师 Igor Sysoev 开发&#xff0c;最初用于解决高并发场景下的性能问题&#xff0c;因其轻量级、高…

SpringCloud——Nacos注册中心、OpenFeign

一、Nacos注册中心 1.注册中心原理 2.服务注册 添加依赖&#xff1a; <!--nacos 服务注册发现--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dep…

WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验

一、WAF绕过文件上传漏洞 win7&#xff1a;10.0.0.168 思路&#xff1a;要想要绕过WAF&#xff0c;第一步是要根据上传的内容找出来被拦截的原因。对于文件上传有三个可以考虑的点&#xff1a;文件后缀名&#xff0c;文件内容&#xff0c;文件类型。 第二步是根据找出来的拦截原…

榕壹云健身预约系统:多门店管理的数字化解决方案(ThinkPHP+MySQL+UniApp实现)

随着全民健身热潮的兴起,传统健身房在会员管理、课程预约、多门店运营等方面面临诸多挑战。针对这一需求,我们开发了一款基于ThinkPHP+MySQL+UniApp的榕壹云健身预约系统,为中小型健身机构及连锁品牌提供高效、灵活的数字化管理工具。本文将详细介绍系统的技术架构、核心功能…

nginx去掉暴漏外边的版本号

背景 在做安全扫描的时候&#xff0c;对方说nginx会暴漏版本号属于中危漏洞 解决方法 nginx 在http{括号里增加 server_tokens off; # 关闭版本号显示# add_header Server "Apache/2.4.3"; # 伪造为 Apache 服务器&#xff08;可选&#xff09;效果