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

C++ 递归算法实战:汉诺塔问题解析

汉诺塔问题通过递归思想将 n 个盘子从起始柱移动到目标柱。核心策略是将 n-1 个盘子暂存辅助柱,移动最大盘到目标柱,再将 n-1 个盘子移回目标柱。递归终止条件为 n=1 时直接移动。代码使用 DFS 函数实现逻辑,展示分治算法在处理移动约束问题中的典型应用。

lzdxwyh发布于 2026/3/14更新于 2026/6/722 浏览
C++ 递归算法实战:汉诺塔问题解析

C++ 递归算法实战:汉诺塔问题解析

题目描述

文章配图

题目示例

文章配图

算法原理(递归)

思路

这是一道递归方法的经典题目,我们可以先从最简单的情况考虑:

  • 假设 n=1,只有一个盘子,很简单,直接把它从 A 中拿出来,移到 C 上;
  • 如果 n=2 呢?这时候我们就要借助 B 了,因为先盘子必须时刻都在大盘子上面,共需要 3 步 (为了方便叙述,记 A 中的盘子从上到下为 1 号,2 号)
    • 1 号盘子放到 B 上
    • 2 号盘子放到 C 上
    • 3 号盘子放到 C 上 至此,C 中的盘子从上到下为 1 号,2 号。
  • 如果 n>2 呢?这时我们需要用到 n=2 时的策略,将 A 上面的两个盘子挪到 B 上,再将最大的盘子挪到 C 上,最后将 B 上的小盘子挪到 C 上就完成了所有步骤。假如 n=3 时如下图:

文章配图

因为 A 中最后处理的是最大的盘子,所以在移动过程中不存在大盘子在小盘子上的情况。 则本题可以解释为:

  • 对于规模为 n 的问题,我们需要将 A 柱上的 n 个盘子移动到 C 柱上。
  • 规模为 n 的问题可以被拆分为规模为 n-1 的子问题:
    • a.将 A 柱上的上面 n-1 个盘子移动到 B 柱上。
    • b.将 A 柱上的最大盘子移动到 C 柱上,然后将 B 柱上的 n-1 个盘子移动到 C 柱上。
  • 当问题的规模变为 n=1 时,即只有⼀个盘子时,我们可以直接将其从 A 柱移动到 C 柱
  • 需要注意的是,步骤 2.b 考虑的是总体问题中的 子问题 b 情况。在处理子问题的子问题 b 时,我们应该将 A 柱中的最上面的盘子移动到 C 柱,然后再将 B 柱上的盘子移动到 C 柱。在处理总体问题的子问题 b 时,A 柱中的最大盘子仍然是最上面的盘子,因此这种做法是通用的

算法流程

递归函数设计:void hanotaa(vector& A, vector& B, vector& C, int n)

  • 返回值:无;
  • 参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)。
  • 函数作用:将 A 中的上面 n 个盘子挪到 C 中

递归函数流程:

  • 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回
  • 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
  • 将 A 中最上面的⼀个盘子挪到 C 中;
  • 将 B 中上面 n-1 个盘子挪到 C 中

文章配图

文章配图

解法代码(C++)

class Solution {
public:
    void dfs(vector<int>& A, vector<int>& B, vector<int>& C, int n) {
        if (n == 1) {
            C.push_back(A.back());
            A.pop_back();
            return;
        }
        dfs(A, C, B, n - 1);
        C.push_back(A.back());
        A.pop_back();
        dfs(B, A, C, n - 1);
    }

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

目录

  1. C++ 递归算法实战:汉诺塔问题解析
  2. 题目描述
  3. 题目示例
  4. 算法原理(递归)
  5. 思路
  6. 算法流程
  7. 解法代码(C++)
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 昇腾 NPU 部署 Llama 2 模型:性能测试与优化实战
  • 浮点误差与量子叠加态:C++高精度模拟细节
  • 无人机电源管理系统:升压降压电路设计
  • Git 版本管理工具基础使用指南
  • GitHub Copilot 学生认证教程及配置指南
  • Quartus Prime FPGA 开发新手入门指南
  • Whisper-turbo 速度实测:云端 GPU 7 倍加速
  • 前端视角 | 从零搭建并启动若依后端(环境配置)
  • 大规模语言模型:从理论到实践
  • 大语言模型中文书籍出版及技术框架介绍
  • 基于 YOLO26 的无人机视角路面病害检测识别系统
  • Jetson 部署 OpenClaw 接入飞书机器人打造本地 AI 助手
  • Linux 进程信号入门:从 Ctrl+C 到信号处理机制
  • HarmonyOS 5.0 端侧 AI 智能工业质检 APP 开发实战
  • 新版 VS Code 禁用 Ctrl+I 快捷键调用的 Copilot AI 对话框
  • Visual C++ 运行库安装失败问题排查与修复指南
  • Cursor Composer Agent 详解:多 Agent 协作完成复杂项目
  • Go2RTC 视频直播推流服务支持 H265
  • Git 工作流程详解:核心概念与主流模式选择
  • 基于 Playwright 封装 Web 爬虫并隐藏自动化特征

相关免费在线工具

  • 加密/解密文本

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