跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

C++ 递归实战:汉诺塔问题详解

汉诺塔是递归算法的经典案例。核心思路是将 n 个盘子的移动分解为 n-1 个子问题:先将 n-1 个盘子移至辅助柱,再将最大盘子移至目标柱,最后将 n-1 个盘子从辅助柱移至目标柱。代码通过 DFS 函数实现这一逻辑,注意递归终止条件为 n=1 时的直接移动。

开源信徒发布于 2026/3/23更新于 2026/5/13 浏览
C++ 递归实战:汉诺塔问题详解

汉诺塔是学习递归算法的必经之路。这道题的核心不在于如何一步步搬动盘子,而在于如何将复杂的大问题拆解为简单的子问题。

假设我们有三根柱子 A、B、C,初始时 A 上有 n 个盘子。我们的目标是将所有盘子移到 C 上,且过程中大盘子不能压在小盘子上。

思考一下 n=1 的情况,直接从 A 移到 C 即可。 如果是 n=2,先把上面的小盘移到 B,大盘移到 C,再把小盘从 B 移到 C。 推广到 n,策略就很清晰了:

  1. 把 A 上的 n-1 个盘子借助 C 移到 B;
  2. 把 A 上剩下的最大盘子直接移到 C;
  3. 把 B 上的 n-1 个盘子借助 A 移到 C。

这就是递归的本质:用同样的逻辑解决规模更小的同类问题。

下面是具体的 C++ 实现。这里使用 DFS 模拟移动过程,参数中动态调整辅助柱和目标柱的角色,确保逻辑通用。

class Solution {
public:
    // 辅助函数:将 n 个盘子从 src 移到 dst,aux 作为辅助
    void dfs(vector<int>& src, vector<int>& aux, vector<int>& dst, int n) {
        if (n == 1) {
            // 只有一个盘子时,直接移动
            dst.push_back(src.back());
            src.pop_back();
            return;
        }
        // 1. 将 n-1 个盘子从 src 移到 aux
        dfs(src, dst, aux, n - 1);
        // 2. 将最大的盘子从 src 移到 dst
        dst.push_back(src.back());
        src.pop_back();
        // 3. 将 n-1 个盘子从 aux 移到 dst
        dfs(aux, src, dst, n - 1);
    }

    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {
        int n = A.size();
        dfs(A, B, C, n);
    }
};

注意看 dfs 的参数顺序变化。在第一步递归调用时,我们将 C 作为了辅助柱;而在第三步时,A 变成了辅助柱。这种角色互换是递归解法中最容易出错的地方,也是精髓所在。

运行这段代码,你会看到盘子按照规则被正确搬运。掌握这个模式后,类似的树形遍历或状态搜索问题也能迎刃而解。

  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • AI 编程实战:自动化生成、低代码与算法优化
  • 30 岁转行产品经理可行性分析与入门实战指南
  • Flutter for OpenHarmony 集成 dart_openai 接入 AI 大模型
  • 多模态文本智能技术:AI 语义理解与执行工程实现
  • MCP 服务集成实战:browser-tools-mcp 配置教程
  • 2024 中国“大模型 + 数据分析”最佳实践案例 TOP10 发布
  • LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
  • 拆解 Garry Tan 的 gstack 架构逻辑:AI 工程化协作模式
  • AI 入门:常见术语解释与误区澄清
  • 华为预训练大模型白皮书核心观点与技术趋势分析
  • 基于代价模型的连接条件下推优化技术
  • 前端跨子域通讯深度解析:核心方案与避坑指南
  • Java OCR 实战:RapidOCR 快速集成与优化指南
  • 前端表格性能优化:虚拟滚动实现百万级数据流畅渲染
  • 最佳信号覆盖问题
  • 数据结构初阶:顺序表的概念与动态实现
  • FPGA 图像处理:图像畸变矫正原理及 MATLAB 与 FPGA 实现
  • AI 大模型通信机制:流式传输与数据封装逻辑解析
  • Java 动态分析技术:原理与实战
  • Harness Engineering:给 AI 套上缰绳的工程学

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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