跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 数据结构与算法:定义、递归与迭代比较

数据结构与算法的基本定义,重点对比了递归与迭代两种算法策略。阐述了迭代的循环执行特性及递归的调用栈机制,分析了尾递归优化原理及递归树在分治问题中的应用。通过代码示例展示了两者在求和与斐波那契数列中的实现差异,指出递归虽直观但消耗更多内存,迭代效率通常更高。

萤火微光发布于 2026/3/30更新于 2026/9/1064 浏览
C++ 数据结构与算法:定义、递归与迭代比较

第一章 数据结构与算法基本概念

1.1 数据结构定义

数据结构:相互之间存在一种或者多种特定关系的数据元素的集合。在逻辑上可以分为线性结构、散列结构、树形结构和图形结构等。

1.2 算法定义

算法:求解具体问题的步骤描述,代码上表现出来是解决特定问题的一组有限的指令序列。

1.3 递归与迭代

本节参考了《Hello 算法》第二章内容。

1.3.1 迭代

迭代(iteration)是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段代码,直到这个条件不再满足。

下面以 for 循环为例,求 1+2+3+…+100 的和。

int forLoop(int n) {
    int ret = 0;
    // 循环求和
    for (int i = 1; i <= n; ++i) {
        ret += i;
    }
    return ret;
}
1.3.2 递归

递归(recursion)是一种算法策略,通过函数调用自身来解决问题。它主要包含两个阶段。

  1. 递:程序不断深入地调用自身,通常传入更小或更简化的参数,直到达到'终止条件'。
  2. 归:触发'终止条件'后,程序从最深层的递归函数开始逐层返回,汇聚每一层的结果。

而从实现的角度看,递归代码主要包含三个要素。

  1. 终止条件:用于决定什么时候由'递'转'归'。
  2. 递归调用:对应'递',函数调用自身,通常输入更小或更简化的参数。
  3. 返回结果:对应'归',将当前递归层级的结果返回至上一层。

比如下面代码:

int recurSum(int n) {
    // 1 终止条件
    if (n == 1) {
        return 1;
    }
    // 2 递归调用
    int ret = recurSum(n - 1) + n;
    cout << "ret = " << ret << endl;
    // 3 归:返回结果
    return ret;
}

理解和总结:每次递归都开辟一个栈帧开始递的过程,然后当 n=1 时结束递的过程,开始归,归的时候从递的下面一行开始运行。

程序运行结果:

/* ret =3 ret =6 ret =10 ret =15 */ 
1 递归和迭代的思想比较

以 1+2+3+…+100 为例,虽然递归和迭代都能求出这个问题,但是这两种完全不同的思考和解决问题的范式。

迭代:'自下而上'地解决问题。从最基础的步骤开始,然后不断重复或累加这些步骤,直到任务完成。比如先求 1+2=3,然后再求 3+4,…,这样的方法最后求出 sum() + 100。从小数一直累加的方法。

递归:'自上而下'地解决问题。先将远问题分解为更小的问题,这些子问题和原问题有相同的形式。然后再将子问题分解为更小的子问题,直到基本情况时停止。比如上面的求和代码中,递的过程就是分解子问题 f(n) = n+f(n−1),将 100 分解为 99+100, 98+99 的过程,一直分解为 1+2,然后开始归。

2 调用栈

递归函数每次调用自身时,系统都会为新开启的函数分配一个栈空间。而迭代只有一个栈空间,因此递归比迭代更加消费内存空间。

函数调用会产生额外的开销,因此递归比循环效率更低。

3 尾递归

如果函数在返回前的最后一步才进行递归调用,则函数可以被编译器优化,使其在空间上与迭代相当,这中情况称为尾递归。

普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下文。求和操作是在'归'的过程中执行的,每层返回后都要再执行一次求和操作。

尾递归:递归调用是函数返回前的最后一个操作,这意味着函数返回到上一层级后,无须继续执行其他操作,因此系统无须保存上一层函数的上下文。

int tailRecSum(int n, int ret) {
    // 1 终止条件
    if (n == 0) {
        return ret;
    }
    // 2 递归调用
    return tailRecSum(n - 1, ret + n);
}

求和操作是在'递'的过程中执行的,'归'的过程只需层层返回。

4 递归树

当处理与'分治'相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以'斐波那契数列'为例。

问题 给定一个斐波那契数列 0, 1, 1, 2, 3, 5, 8, 13, …,求该数列的第 n 个数字。 数列的前两个数字为 f(1) = 0 和 f(2) = 1。 数列中的每个数字是前两个数字的和,即 f(n) = f(n − 1) + f(n − 2)。

代码实现:

int fib(int n) {
    // 终止条件
    if (n == 1 || n == 2) {
        return n - 1;
    }
    // 递归调用 f(n) = f(n-1) + f(n-2)
    int ret = fib(n - 1) + fib(n - 2);
    return ret;
}

上面代码,在函数内递归调用了两个函数,这意味着从一个调用产生了两个调用分支,这样的递归会产生一个递归树,层数为 n 的递归树,以 5 层为例子。

递归体现了'将问题分解为更小子问题'的思维范式,这种分支策略至关重要。

5 递归和迭代对比

为了理解递归过程,使用栈来模拟递归的过程:

int forLoopRecurSum(int n) {
    // 1 终止条件
    stack<int> s;
    int ret = 0;
    // 模拟递的过程
    for (int i = n; i > 0; --i) {
        s.push(i);
    }
    // 归的过程
    while (!s.empty()) {
        ret += s.top();
        s.pop();
    }
    return ret;
}

目录

  1. 第一章 数据结构与算法基本概念
  2. 1.1 数据结构定义
  3. 1.2 算法定义
  4. 1.3 递归与迭代
  5. 1.3.1 迭代
  6. 1.3.2 递归
  7. 1 递归和迭代的思想比较
  8. 2 调用栈
  9. 3 尾递归
  10. 4 递归树
  11. 5 递归和迭代对比

更多推荐文章

查看全部
  • 从 BERT 到 GPT:Transformer 模型在 AI 发展中的作用
  • 本地 Qwen 与 ComfyUI 制作 AI 漫剧教程
  • 腾讯游戏 2026 年 Q1 财报:AI 技术驱动业务增长
  • openEuler 多样性算力支持深度评测:x86 与 ARM 双架构适配及性能验证
  • AI 时代重读《人人都是产品经理》:核心内核与落地实践
  • CentOS 7 部署 Docker、PostgreSQL 与 Redis 实战指南
  • Python 零基础入门与学习路径指南
  • 前端缓存策略:让你的网站飞起来
  • Spring 启动报错:Could not resolve placeholder jdbc.url 解决方案
  • Z-Image-Turbo 与 Stable Diffusion 实测对比
  • 基于 C++11 手写 Promise 实现原理及与 std::promise 对比
  • 2025 AI 大模型年终盘点:谷歌反超国产爆发三大榜单解析
  • 中国 AI 大模型在巴黎奥运会应用及近期 AI 技术动态
  • AIGC 在艺术创作中的应用与机遇
  • OpenClaw:构建本地私有化 AI 助手与自动化工作流
  • 基于 Coze 平台的企业级 AI 客服机器人搭建实战
  • C 语言算法与数据结构实战:从数组到递归的避坑之旅
  • Kotlin 注解详解:声明、应用与元注解
  • 飞算 JavaAI 智能辅助开发功能评测
  • AI Agent 架构:基础组成模块深度解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online